0

派生クラスへのポインタとして戻り型を持つ関数を基本クラスに含めることは可能ですか?主な目的は、後で使用する場所で、Classを使用BaseDerivedて値を設定することです。

Base B1;
B1.SetName("nameOfBase");
Derived* D1 = B1.CreateDerived("DerivedFromBase");//CreateDerived method will be in class Base
D1->SetMinPoint(0,1);//this method will be implemented in derived class
D1->SetMaxPoint(4,4);//this method will be implemented in derived class

私は実装に問題があります、私は次のようなことをしました

class Base
{
public:
  Base();
  bool SetName(char*);//or SetName(string)
  Derived* CreateDerived(char*); // or Derived* CreateDerived(string)
  ~Base();
protected:
  char baseName[20];// or string baseName
  Derived* derivedPtr[5];
};

class Derived: public Base
{
public:
  Derived();
  bool SetName(char*);//the name given in Derived* CreateDerived(char*) will be set here
  ~Derived(); 
};

これを実行してプログラムを実行しようとすると、次のようなエラーが発生します

// Derived* CreateDerived(char*); // or Derived* CreateDerived(string)
error C2143: syntax error: missing ';' before '*'
error C4430: missing type identifier: int assumed.
4

2 に答える 2

1

はい、可能です。やや疑わしいデザインのようですが、それを妨げるものは何もありません。Derivedクラスを参照する前に、クラスを宣言する必要があります。

class Derived;  //forward declaration here

class Base
{
public:
  Base();
  bool SetName(char*);//or SetName(string)
  Derived* CreateDerived(char*); // or Derived* CreateDerived(string)
  ~Base();
protected:
  char baseName[20];// or string baseName
  Derived* derivedPtr[5];
};

class Derived: public Base
{
public:
  Derived();
  bool SetName(char*); //don't forget semi-colon
  ~Derived(); 
};

また、@ psurが述べたように、の後にセミコロンがありませんでしたSetName

また、C++では文字列std::stringの代わりにを使用することを強くお勧めします。char*

于 2013-03-25T10:00:20.967 に答える
0

CreateDerivedメソッドを純粋な仮想にして、派生クラスでオーバーライドすることはできませんか?Baseクラスのメソッドの戻り型はBaseになります、派生クラスのオーバーライドされたメソッドは、必要なDerivedインスタンスを返す可能性があります。それがテンプレートメソッドパターンだと思います。

クラスの継承は、常にis-aリレーションのように動作する必要があります(Derived-Class is-a Base-Class)。あなたのデザインの提案は、このルールを損なうものだと思います。

于 2013-03-25T10:11:04.050 に答える