6

同じメイン (main.cpp) ファイルを使用する一連のプログラムを作成しようとしていますが、別のセカンダリ ソース ファイル (object1.cpp、object2.cpp など) を使用しています。したがって、基本的に次のようにコンパイルします。

g++ -o program1.exe main.cpp object1.cpp
g++ -o program2.exe main.cpp object2.cpp

私がやりたいことは、objectN.cpp に、メイン ファイルから呼び出される特定のメソッドが実装されたクラスを定義させることです。ソースコードは次のようになります。

ヘッダー ファイル (object.hpp)

#ifndef INCLUDE_OBJECT_HPP
#define INCLUDE_OBJECT_HPP

class MyObjectInterface
{
public:
  MyObjectInterface();
  virtual ~MyObjectInterface() {};
  virtual void MethodA() = 0;
  virtual void MethodB() = 0;
};

#endif

object1.cpp

#include <iostream>
#include "object.hpp"

using namespace std;

class MyObject : public MyObjectInterface
{
private:
  int member;

public:
  MyObject(int a)  { member = a; }
  void MethodA() { cout << member << endl; }
  void MethodB() { cout << member*2 << endl; }
};

main.cpp

#include <iostream>
#include "object.hpp"

using namespace std;

MyObjectInterface *x;

int main()
{
  x = new MyObject(1);
  x->MethodA();
  x->MethodB();
  return 0;
}

object2.cpp は object1.cpp と同様の構造体を持ちますが、クラスは異なるデータ メンバーを持ちます。

main.cpp に MyObject のクラス宣言を含める必要があるため、これを機能させることができません。しかし、各 object*.cpp ファイルは、異なるメンバーを持つ MyObject クラスを宣言するため、オブジェクトごとに異なるヘッダーが必要なため、単純に別の object.hpp ヘッダーを作成してメインに含めることはできません。main が知っておくべき唯一のことはメソッドです。

問題を明確に説明できたことを願っています。コメントを残していない場合は、明確にしようとします。このようなことを行うための本当に簡単な方法があるはずですが、私はそれを理解できません。

ありがとう

4

2 に答える 2

6

main.cpp に MyObject のクラス宣言を含める必要があるため、これを機能させることはできません

いいえ、ありません。ファクトリーメソッドを作る

*.h:

MyObjectInterface* makeObject();

*.cpp:

MyObjectInterface* makeObject(){
    return new MyObject;
}

ただし、異なるファイルで宣言された同じ構造を持つ同じ名前のクラスがあると、特定の状況で一部のコンパイラが混乱する可能性があります (まれですが、発生する可能性があります)。

また、より良い解決策は、プログラムの構造を再考することです。派生クラスは異なるデータ メンバーを持つことが想定されているため、おそらくそれらのデータ メンバーにアクセスする必要があります。おそらくそれらの memebrs にアクセスする必要があるため、そのクラスについて何かを知る必要があるため、その宣言をヘッダーに入れる必要があります。

もう 1 つの問題は、クラスがある種の概念を表していることです。そのため、一意の名前を選択するのはかなり簡単です。同じ名前の異なるクラスが多数ある場合は、設計上の問題が発生する可能性があります。クラスが固有の概念を表しておらず、不必要に多くのクラスを作成することになります。

于 2012-05-30T23:01:59.260 に答える
3

考えられる解決策の 1 つは、この関数を で宣言することですobject.hpp

MyObjectInterface * createInstance();

.cpp2 つのファイルで次のように実装します。

MyObjectInterface * createInstance() {
    return new MyObject();
}

そして交換

x = new MyObject(1);

x = createInstance();
于 2012-05-30T23:01:31.540 に答える