c ++ヘッダーファイルで定義されたクラスにメソッドを追加
質問
メインプログラムのメソッドをヘッダーファイルで定義された既存のクラスに追加することが可能かどうか疑問に思っています。
例えば:
ファイルclass CFun
にCFun.hpp
が定義されていますが、このparty.cpp
では、編集せずにメソッドを追加しますvoid hello() {cout << "hello" << endl;};
明らかに(残念ながら)構築:
#include "CFun.hpp"
class CFun
{
public:
void hello() {cout << "hello" << endl;};
};
エラーを返しても動作しませんMultiple declaration for 'CFun'
クラスを継承せずに動作させることは可能ですか?
解決
いいえ。ただし、参照/ポインタをCFunクラスに取得するメソッドを追加できます-プライベートデータにアクセスすることはできません:
void Hello(CFun &fun)
{
cout << "hello" << endl;
}
これはおそらくあなたができる最善の方法です。 litbが指摘したように、この関数はCFunと同じ名前空間になければなりません。幸いなことに、クラスとは異なり、名前空間は複数の場所に追加できます。
他のヒント
次のようにクラスを再定義できます:
#define CFun CLessFun
#include "CFun.hpp"
#undef CFun
class CFun : CLessFun
{
public:
void hello() {cout << "hello" << endl;};
};
これを新しいヘッダーファイルCMoreFun.hpp
に入れ、CFun.hpp
いいえ、それは不可能です。特定のクラスの定義は1つだけで、完全な定義である必要があります。つまり、クラスにメンバーを追加して、異なる場所に部分的な定義を含めることはできません。
クラスにメンバー関数を追加する必要がある場合は、クラス定義を変更する(CFun.hppを編集する)か、CFun
から新しいクラスを派生してhello()
をそこに配置する必要があります。
C ++のその種の構成(定義済みクラスに機能を追加)に最も近いものは、デコレーターパターンです。それはまさにあなたが望んでいることではありませんが、あなたが必要なことをすることができるかもしれません。
これは、継承の明らかなユースケースのようです。新しいクラスを定義します:
#include "CFun.hpp"
class CFun2 : public CFun
{
public:
void hello() {cout << "hello" << endl;};
};
次に、ソースコードでCFun2
の代わりにCFun
を使用します。
それについて考えた後、ひどいことをすることができます:必要な戻り値の型を持ち、ヘッダー全体で一度だけ言及されている関数をCFunで見つけてください。 void GoodBye()
としましょう。
次のコンテンツでファイルCFunWrapper.hppを作成します:
#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye
その後、CFun.hppの代わりにCFunWrapper.hppのみを含めます。
しかし、そうする理由が本当にない限り、これをしないでください。 CFun.hppの内容によっては、非常に壊れやすく、不可能な場合もあります。
知らない。ただし、何らかの審査員によるリギングを行って、名前空間のソリューションを作成することもできます。
class Party : class CFun
(あなたのparty.cpp)
hello()関数を含むCFunのものを継承します。
そう...
Party p;
p.hello();
いいえ?