2013-03-25 3 views
0

Возможно ли иметь функцию в базовом классе, которая будет иметь возвращаемый тип в качестве указателя на производный класс? основная цель заключается в дальнейшем использовании, когда вы используете 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. 
+2

Вы должны найти шаблон завода – alestanis

+2

, почему вы не возвращаете базу *? А Base, имеющий массив Derived *, выглядит как странный дизайн, я бы сказал, –

+0

У вас нет ';' after 'bool SetName (char *)' – psur

ответ

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.

И я настоятельно рекомендую использовать std::string вместо char* для строк в C++.

+0

Thats awesome !!!! теперь работает отлично. На самом деле я занимаюсь стажировкой в ​​Bosch. Его довольно сложно объяснить весь проект. Тонкс снова за помощью. Мне было интересно об этом со вчерашнего дня. – Cybercop

+0

@ Biplov13 Если это решило вашу проблему, вы можете пометить ответ как принятый (с помощью кнопки отметки галочки). Вот как работает SO. – Angew

0

Не можете ли вы сделать свой метод CreateDerived чистым виртуальным и переопределить его в производных классах? Возвращаемый тип метода в базовом классе будет Base, но переопределенный метод в производном классе может вернуть экземпляр Derived, который вам нужен. Я думаю, что это шаблон метода шаблона .

Наследование вашего класса должно всегда вести себя как отношение is-a (производный класс is-a Base-Class). Я думаю, что ваше дизайнерское предложение подрывает это правило.

+0

на самом деле это можно сделать с помощью виртуальной функции, без сомнения. Но мой учитель (также клиент для этого проекта) мне сказал, чтобы достичь цели, о которой я упомянул, что будет невозможно с помощью виртуальной функции. Будет ли он? – Cybercop

+0

Конечно, если вы ** должны ** вернуть тип производного класса в базовый класс, мой ответ не очень помогает. Но подход действительно выглядит странным для меня. – anhoppe

Смежные вопросы