簡體   English   中英

使用返回類型作為派生類的指針

[英]using the return type as pointer to derived class

是否有可能在基類中具有將返回類型作為派生類的指針的函數? 主要目標是供以后使用,在其中使用Base類和Derived類設置值。

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.

是的,有可能。 這似乎是一個有問題的設計,但是沒有什么可以阻止您這樣做。 您只需要在引用它之前聲明類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*作為字符串。

您不能將CreateDerived方法設為純虛擬方法,並在派生類中重寫它嗎? Base類中方法的返回類型為Base ,但派生類中的重寫方法可以返回所需的Derived實例。 我認為這是Template Method-Pattern

您的類繼承應始終像is-a關系一樣(Derived-Class is- aBase-Class)。 我認為您的設計建議會破壞該規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM