13

メインプログラムのメソッドをヘッダーファイルで定義されている既存のクラスに追加できるかどうか疑問に思っています。例:class CFunファイルに定義されていますCFun.hppが、ここでは編集せずparty.cppにメソッドを追加しますvoid hello() {cout << "hello" << endl;};CFun.hpp

明らかに(残念ながら)構造:

#include "CFun.hpp"

class CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

エラーを返すように動作しませんMultiple declaration for 'CFun'

クラス継承なしで動作させることは可能ですか?

4

8 に答える 8

10

いいえ。ただし、CFunクラスへの参照/ポインターを取得するメソッドを追加することはできます。プライベートデータにアクセスすることはできません。

void Hello(CFun &fun)
{
    cout << "hello" << endl;
}

これはおそらくあなたができる最高のことです。litbが指摘しているように、この関数はCFunと同じ名前空間にある必要があります。幸い、クラスとは異なり、名前空間は複数の場所に追加できます。

于 2008-10-29T22:20:44.627 に答える
5

次のようにクラスを再定義できます。

#define CFun CLessFun
#include "CFun.hpp"
#undef CFun

class CFun : CLessFun
{
   public:
    void hello() {cout << "hello" << endl;};
};

これを新しいヘッダーファイルに入れて、CMoreFun.hpp代わりにインクルードしますCFun.hpp

于 2013-01-21T09:35:13.483 に答える
3

いいえ、それは不可能です。特定のクラスの定義は1つだけであり、完全な定義である必要があります。つまり、異なる場所に部分的な定義を設定して、クラスにメンバーを追加することはできません。

クラスにメンバー関数を追加する必要がある場合は、クラス定義を変更するか(CFun.hppを編集)、そこから新しいクラスを派生させてそこCFunに配置hello()する必要があります。

于 2008-10-29T22:20:49.617 に答える
2

C++ でのこの種の構成 (事前定義されたクラスに機能を追加する) に最も近いものは、Decorator パターンです。それはまさにあなたが求めているものではありませんが、あなたが必要とすることを可能にするかもしれません.

于 2008-10-29T22:33:38.390 に答える
2

これは、継承の明らかな使用例のようです。新しいクラスを定義します。

#include "CFun.hpp"

class CFun2 : public CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

次に、ソース コードでCFun2代わりに使用します。CFun

于 2011-09-15T14:24:15.770 に答える
1

それについて考えた後、あなたは恐ろしいことをすることができます.CFunで、必要な戻り値の型を持ついくつかの関数を見つけ、ヘッダー全体で1回だけ言及します. としましょうvoid GoodBye()

次の内容でファイル CFunWrapper.hpp を作成します。

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye

次に、CFun.hpp の代わりに CFunWrapper.hpp のみを含めます。

ただし、本当に正当な理由がない限り、これを行わないでください。CFun.hpp の内容によっては、非常に破損しやすく、不可能な場合もあります。

于 2008-10-29T22:30:55.260 に答える
0

私の知る限りではありません。ただし、ある種の仮帆装を実行して、名前空間のようなソリューションを作成することはできます。

于 2008-10-29T22:12:39.760 に答える
0
class Party : class CFun

(あなたのパーティー.cpp)

hello() 関数を含む CFun のものを継承します。

そう...

Party p;
p.hello();

いいえ?

于 2008-11-28T01:26:56.537 に答える