Я пытаюсь написать свой код клиента для завода 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;
}
Спасибо! Мой компилятор говорит, неопределенная ссылка на 'виртуальных таблицы для ' неопределенной ссылки на' ShellFactory :: createBshell()' ShellFactory неопределенной ссылку на 'TypeInfo для ShellFactory»
Factorymaker * fmaker = новый Factorymaker(); ShellFactory * sf = fmaker-> getFactory ("Bshell"); Shell * bshellproduct = sf-> createBshell(); –
@SinanTalebi: Это потому, что вы объявляете три чистые функции в базовом классе «ShellFactory» и только переопределяете их на каждом конкретном заводе. Вероятно, вы должны изменить интерфейс на одну функцию 'create()'. –
Решенный! Спасибо, Майк. –