0

ファクトリ クラスとインターフェイスを実装しようとしています。しかし、私は以下のエラーメッセージを受け取っています。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
4

2 に答える 2

1

NormalTaxManagerand のImportedTaxManager前に宣言する必要がありますTaxInterface

また、逆の操作も必要です。

その (古典的な) C++ 循環参照の問題を修正するには、コードを .cpp ファイルと .h ファイルに分割する必要があります。

TaxInterfaceこれは抽象的であり、独自のファイルに実装されていません: TaxInterface.h .

たとえばImportedTaxManager、2 つのファイルに分割します。

.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

よろしく

于 2015-11-01T14:10:47.440 に答える