2017-05-09 25 views
2

慣例は、純粋な仮想インターフェイスクラスを処理する文字 "I"です。しばしば、サブクラス用の共有機能を持つ部分的な具象クラスも必要であることがわかります。だから、具体的な名前空間サブクラスを持つインターフェイスクラスのC++クラス命名規則

class IFoo {...} 
class Foo : public IFoo {...} 

は私が名前空間で区別はFooから派生サブクラスをしたいとき難問に名前を付けるに実行します。例えば、

Bar::Foo 
Baz::Foo 

私は

namespace Bar { class Foo : public Foo {} } 

をコーディングする際に、驚くほど、VSは、「クラスは、自身のベースクラスにはできません」というエラーを与えるわけではないため。 (命名はバー:: IFoo、およびバズ:: IFooがあるので、何も「中間クラスは、ありませんれていない問題。)私は

class MyFoo : public IFoo 
namespace Bar { class Foo : public MyFoo {} } 

または

namespace base { class Foo : public IFoo {} } 
namespace Bar { class Foo : public base::Foo {} } 

だろうがと、この問題を回避することができます

私はFoo、Bar :: Foo、Baz :: Fooというクラスを持っているのは分かりやすい混乱のために悪いです(例えば、 "Basを使う"を追加するとあいまいさがあります)。Is Is私がしようとしていることを明確に関連付ける命名規則や構文がありますか?

+0

私は個人的には「使用する」を使用しません。合理的に使用するには時間がかかりすぎる場合は、関数/クラスまたは実装ネームスペースで 'typedef'を使用します。命名の競合を避けることができ、関数/クラスが使用されている場所から関数/クラスが来た場所を知ることができます。 –

+0

私はあなたが3つのクラスのよりわかりやすい名前を見つけることを試みるべきだと思う、そして問題は消え去るでしょう。とにかく、IコンベンションはC#のものです。 –

答えて

2

これらの同じ名前のタイプをすべて持つことは悪い考えであることを肯定し、具体的には、グローバル名前空間のタイプを::という接頭辞を付けて参照することができます。この場合、グローバル名前空間からタイプFooを参照することができますが、Fooを定義する名前付けスコープのコンテキストでは、グローバル名空間を::Fooとして参照することができます。だからこのworks

class IFoo {}; 
class Foo : public IFoo {}; 

namespace Bar { class Foo : public ::Foo {}; }