2013-11-26 2 views
0

Я пытаюсь написать свой код клиента для завода abs, но я застрял в клиентском коде. Я не могу создать экземпляр любого Bshell на Factorymaker.getFactory("Bshell"); код компилирует без кода клиентаAbstract Factory Pattern Код клиента

(я новичок в StackOverflow. Мой iostream нормально в моем коде.)

#include <iostream> 

using namespace std; 
//This is the abstract product. 
class Shell { 

public: 
    virtual void printShell(){ cout << "I am the abstract product\n"; } 
}; 
class Bshell : public Shell { 

public: 
    Bshell(); 
    Bshell(string arg){ cout << "I am " << arg << endl; } 
    void printShell(){ cout << "I am Bshell\n"; } 
}; 
class Cshell : public Shell { 

public: 
    Cshell(); 
    Cshell(string arg){ cout << "I am " << arg << endl; } 
    void printShell(){ cout << "I am Cshell\n"; } 
}; 
class Kshell : public Shell { 

public: 
    Kshell(); 
    Kshell(string arg){ cout << "I am " << arg << endl; } 
    void printShell(){ cout << "I am Kshell\n"; } 
}; 
//This is the abstract factory. 
class ShellFactory { 

public: 
    virtual Shell* createBshell(); 
    virtual Shell* createCshell(); 
    virtual Shell* createKshell(); 
}; 
//Concrete factories 
class BShellFactory : public ShellFactory { 

public: 
    Shell* createBshell(){ return new Bshell("Bshell"); } 
}; 
class CShellFactory : public ShellFactory { 

public: 
    Shell* createCshell(){ return new Cshell("Cshell"); } 
}; 
class KShellFactory : public ShellFactory { 

public: 
    Shell* createKshell(){ return new Kshell("Kshell"); } 
}; 
//indirectly instantiating factories 
class Factorymaker { 

private: 
    ShellFactory *sf = NULL; 
public: 
    ShellFactory* getFactory(string choice){ 

     if (choice == "Bshell"){ sf = new BShellFactory(); } 
     else if (choice == "Cshell"){ sf = new CShellFactory(); } 
     else if (choice == "Kshell"){ sf = new KShellFactory(); } 
     return this->sf; 
    } 
}; 
int main() 
{ 
    Factorymaker *fmaker = new Factorymaker(); 
    ShellFactory *sf = fmaker.getFactory("Bshell"); 
    Bshell bshellproduct = sf.createBshell(); 
    return 0; 
} 

ответ

1

fmaker и sf являются указателями, поэтому используйте -> не . для доступа к своим членам.

Обратный тип sf->createBshell() - Shell*, так что должен быть тип bshellproduct.

Ваш компилятор должен был рассказать вам обо всем этом.

+0

Спасибо! Мой компилятор говорит, неопределенная ссылка на 'виртуальных таблицы для ' неопределенной ссылки на' ShellFactory :: createBshell()' ShellFactory неопределенной ссылку на 'TypeInfo для ShellFactory»
Factorymaker * fmaker = новый Factorymaker(); ShellFactory * sf = fmaker-> getFactory ("Bshell"); Shell * bshellproduct = sf-> createBshell(); –

+0

@SinanTalebi: Это потому, что вы объявляете три чистые функции в базовом классе «ShellFactory» и только переопределяете их на каждом конкретном заводе. Вероятно, вы должны изменить интерфейс на одну функцию 'create()'. –

+0

Решенный! Спасибо, Майк. –

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