Как реализовать шаблон Factory?

Я пытаюсь реализовать фабричный класс и интерфейс. Но я получаю сообщение об ошибке ниже. Я создал фабричный класс, который решает, какой класс вернуть NormalTaxManager или ImportedTaxManager. Я предоставил абстракцию, используя интерфейс.

#include<iostream>
#include<vector>
using namespace std;

class TaxInterface
{
public:
virtual int calculate_tax(int price,int quantity)=0;
};

class TaxFactory
{
public:
// Factory Method
static TaxInterface *callManager(int imported)
{
if (imported == 0)
return new NormalTaxManager;
else
return new ImportedTaxManager;
}
};

class NormalTaxManager: public TaxInterface
{
public:
virtual int calculate_tax(int price,int quantity)
{
cout << "NormalTaxManager\n";
price=quantity*price*10/100;
return price;
}
};

class ImportedTaxManager: public TaxInterface
{
public:
virtual int calculate_tax(int price,int quantity)
{
cout << "ImportedTaxManager\n";
price=quantity*price*5/100;
return price;
}
};

int main()
{
TaxFactory f;
TaxInterface *a = f.callManager(1);
a->calculate_tax(100,2);
//    int price=TaxInterface::callManager(1)->calculate_tax(100,2);
}

Проблема:

 error: ‘NormalTaxManager’ does not name a type
error: ‘ImportedTaxManager’ does not name a type

0

Решение

Вы должны объявить NormalTaxManager а также ImportedTaxManager до TaxInterface,

И вам также нужно сделать обратное.

Чтобы решить эту (классическую) проблему циклических ссылок на C ++, вам нужно разделить код между файлами .cpp и .h

Положил TaxInterface это абстрактно и не имеет реализации в собственном файле: TaxInterface.h.

Например, раскол ImportedTaxManager в двух файлах:

.час

#pragma once
#include "taxinterface.h"
class ImportedTaxManager : public TaxInterface
{
public:
virtual int calculate_tax(int price, int quantity);
};

.CPP

#include "stdafx.h"#include<iostream>
using namespace std;

#include "ImportedTaxManager.h"
int ImportedTaxManager::calculate_tax(int price, int quantity)
{
cout << "ImportedTaxManager\n";
price = quantity*price * 5 / 100;
return price;
}

Если вы «умны», вы можете «сохранить» некоторые файлы.

Но проще поддерживать код, который разделен между заголовками (.h) и реализацией (.cpp).

Поскольку C ++ нуждается в объявлениях всего, что используется, вы часто получаете циклические ссылки, которые могут быть решены путем разделения между .h и .cpp

Полное рабочее решение: http://1drv.ms/1Pe25SQ

С уважением

1

Другие решения

Вам просто нужно было объявить 2 класса, которые являются производными от TaxInterface над классом TaxFactory, чтобы они были видны ему. Я также сделал несколько рекомендаций внутри main () …

#include<iostream>
#include<vector>
using namespace std;

class TaxInterface
{
public:
virtual int calculate_tax(int price, int quantity) = 0;
};

class NormalTaxManager : public TaxInterface
{
public:
virtual int calculate_tax(int price, int quantity)
{
cout << "NormalTaxManager\n";
price = quantity*price * 10 / 100;
return price;
}
};

class ImportedTaxManager : public TaxInterface
{
public:
virtual int calculate_tax(int price, int quantity)
{
cout << "ImportedTaxManager\n";
price = quantity*price * 5 / 100;
return price;
}
};

class TaxFactory
{
public:
// Factory Method
static TaxInterface *callManager(int imported)
{
if (imported == 0)
return new NormalTaxManager;
else
return new ImportedTaxManager;
}
};

int main()
{
vector<TaxInterface*> interfaces;
vector<int> taxTypes = { 0, 0, 1, 0, 1, 1, 1, 0, 1 };

for (vector<int>::iterator i = taxTypes.begin(); i != taxTypes.end(); i++) {
interfaces.push_back(TaxFactory::callManager(*i));
}

for (int i = 0; i < interfaces.size(); i++) {
interfaces[i]->calculate_tax(100, 2);
}

// system("pause");
return 0;
}
0

По вопросам рекламы [email protected]