Erros在尝试用c ++制作factroy方法时

时间:2017-09-11 15:26:14

标签: c++ design-patterns methods factory

我正在尝试使用此示例代码: https://sourcemaking.com/design_patterns/factory_method/cpp/1 为了使它适合我的程序,我试图改进。 这是我的代码根据文件: VCFReader.h

#pragma once

#include <fstream> // files
#include <locale> // unicode chars and strings
#include <cstdlib> // for exit()
#include <vector> // vector of VCFRecords
#include "VCFRecord.h"
#include "VCFReader3_0.h"
#include "VCFReader2_1.h"

class VCFReader 
{
public:
    static VCFReader *makeVCFReader(std::wstring version); // factory method
    virtual vector<VCFRecord> loadVCFRecordsFromFile(std::wstring pathToFile) = 0;
};

VCFReader.cpp:

#include "VCFReader.h"

VCFReader *VCFReader::makeVCFReader(std::wstring version)
{
    if (version == L"VERSION:3.0")
    {
        return new VCFReader3_0;
    }
    else if (version == L"VERSION:2.1")
    {
        return new VCFReader2_1;
    }
    else
    {
        std::string throwMessage = "Unsupported version: " + std::string(version.begin(), version.end());
        throw throwMessage.c_str();
    }
}

VCFReader3_0.h(与VCFReader2_1.h相同):

#pragma once

#include "VCFReader.h"

class VCFReader3_0 : public VCFReader
{
    virtual vector<VCFRecord> loadVCFRecordsFromFile(std::wstring pathToFile);
};

但是我得到了这些错误:

  

错误C2440'返回':无法从'VCFReader2_1 *'转换为   'VCFReader *'vcfreader.cpp 11

     

错误C2440'返回':无法从'VCFReader3_0 *'转换为   'VCFReader *'vcfreader.cpp 7

多次

  

错误C2504'VCFReader':基类未定义vcfreader2_1.h 5

     

错误C2504'VCFReader':基类未定义vcfreader3_0.h 5

当我做了一点搜索时,我发现错误c2504是由循环定义引起的。但我想不出一种方法,不在派生的基类中包含基类,因为它们是从它派生的,同时如果我不在基类中包含派生类那么我就不能在静态中返回新的派生类功能。 另外 - 为什么我得到这个错误 - C2440以及如何清除它?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您遇到的问题是在至少一个编译单元中VCFReader之前定义了特定版本的读取器类,并且您无法从未定义/不完整类型继承。编译器必须在任何继承它的类之前看到VCFReader的定义。 (这是&#34;基类未定义&#34;错误的来源。)

VCFReader的定义不依赖于特定版本实现的定义,因此循环包含甚至不是必需的。要解决循环问题,您可以删除以下两行:

#include "VCFReader3_0.h"
#include "VCFReader2_1.h"

或者,在 VCFReader类的定义之后移动它们。 (如果删除它们,则必须将它们包含在VCFReader.cpp中。)

转换错误(cannot convert from 'VCFReader2_1 *' to 'VCFReader *')是&#34;基类未定义&#34;的副作用。错误 - 因为编译器在遇到读者版本类时并不知道VCFReader是什么,所以它并不认为它们是从VCFReader继承的,因此它不会认为你应该能够改变指针。解决&#34;基类未定义&#34;错误也应解决这些转换错误。