c++ - 如何实现工厂模式?

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

我正在尝试实现工厂类和接口(interface)。但我收到以下错误消息。我创建了一个工厂类,它决定返回 NormalTaxManager 或 ImportedTaxManager 的类。我已经使用接口(interface)提供了抽象。

#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 之前声明NormalTaxManagerImportedTaxManager

你还需要做相反的事情。

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

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

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

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

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

问候

关于c++ - 如何实现工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33462867/

相关文章:

c++ - 简单数组排序/检查 + 分而治之版本

java - 调用 Object 类的 wait() 方法时出现异常

Python unittest - 在测试中使用模块和类级别设置函数中定义的变量

java - 为什么 Comparable 在 jdk 1.8 中没有声明为 @FunctionalInterface 尽管它是 FunctionalInterface 之一?

c++ - 使用 qmake 构建多个版本的二进制文件

c++ - 解包方法参数的元组

c++ - 调查 visual studio 程序集输出

c++ - 什么样的 OOP 设计决策适合客户端/服务器应用程序中的协议(protocol)情况?

java - 使用界面更新 GUI

ruby - "Interfaces & Abstract Classes unnecessary in Ruby"--> 谁能解释一下?