如何实现工厂模式?
How to implement Factory pattern?
我正在尝试实现工厂 class 和接口。但我收到以下错误消息。我创建了一个工厂 class,它决定 class 到 return 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
您需要在TaxInterface
之前声明NormalTaxManager
和ImportedTaxManager
。
而且你还需要做相反的事情。
为了解决(经典的)C++ 循环引用问题,您需要在 .cpp 和 .h 文件之间拆分代码
将抽象且没有实现的 TaxInterface
放入其自己的文件中:TaxInterface.h.
例如,将 ImportedTaxManager
拆分为两个文件:
.h
#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;
}
如果您 "clever" 您可以 "save" 一些文件。
但是在 headers (.h) 和实现 (.cpp) 之间拆分的代码更容易维护。
因为 C++ 需要对所使用的所有内容进行声明,所以您经常会遇到循环引用,这可以通过在 .h 和 .cpp 之间拆分来解决
完整的工作解决方案:http://1drv.ms/1Pe25SQ
此致
您只需在 TaxFactory class 上方声明从 TaxInterface 派生的 2 个 classes,以便它们对它可见。我还在 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;
}
我正在尝试实现工厂 class 和接口。但我收到以下错误消息。我创建了一个工厂 class,它决定 class 到 return 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
您需要在TaxInterface
之前声明NormalTaxManager
和ImportedTaxManager
。
而且你还需要做相反的事情。
为了解决(经典的)C++ 循环引用问题,您需要在 .cpp 和 .h 文件之间拆分代码
将抽象且没有实现的 TaxInterface
放入其自己的文件中:TaxInterface.h.
例如,将 ImportedTaxManager
拆分为两个文件:
.h
#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;
}
如果您 "clever" 您可以 "save" 一些文件。
但是在 headers (.h) 和实现 (.cpp) 之间拆分的代码更容易维护。
因为 C++ 需要对所使用的所有内容进行声明,所以您经常会遇到循环引用,这可以通过在 .h 和 .cpp 之间拆分来解决
完整的工作解决方案:http://1drv.ms/1Pe25SQ
此致
您只需在 TaxFactory class 上方声明从 TaxInterface 派生的 2 个 classes,以便它们对它可见。我还在 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;
}