如何实现工厂模式?

时间:2015-11-01 13:52:52

标签: c++ oop interface factory-pattern multi-tier

我正在尝试实现工厂类和接口。但我收到以下错误消息。我创建了一个工厂类,它决定返回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

2 个答案:

答案 0 :(得分:1)

您需要在NormalTaxManager之前声明ImportedTaxManagerTaxInterface

你还需要做相反的事情。

为了解决(经典)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;
}

如果你“聪明”,你可以“保存”一些文件。

但是维护在标题(.h)和实现(.cpp)之间分割的代码更容易。

因为C ++需要声明所使用的所有内容,所以通常可以通过在.h和.cpp之间进行拆分来解决循环引用

完整的解决方案:http://1drv.ms/1Pe25SQ

此致

答案 1 :(得分:0)

您只需要在TaxFactory类之上声明派生自TaxInterface的2个类,以便它们可见。我还在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;
}