尝试使用 C++ 创建工厂方法时出错

Erros while trying to make factroy method with c++

我正在尝试使用这个示例代码: 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);
};

但是我得到了这些错误:

Error C2440 'return': cannot convert from 'VCFReader2_1 *' to 'VCFReader *' vcfreader.cpp 11

Error C2440 'return': cannot convert from 'VCFReader3_0 *' to 'VCFReader *' vcfreader.cpp 7

和多次

Error C2504 'VCFReader': base class undefined vcfreader2_1.h 5

Error C2504 'VCFReader': base class undefined vcfreader3_0.h 5

经过一番搜索,我发现错误 c2504 是由循环定义引起的。但是我想不出一种方法来不在派生的 class 中包含基数,因为它们是从它派生的,同时如果我不在基数 [=] 中包含派生的 classes 34=] 那么我不能在静态函数中 return 新派生 classes。 另外 - 为什么我会收到此错误 - C2440 以及如何清除它?

在此先感谢您的帮助!

您 运行 遇到的问题是特定版本 reader class 至少在一个编译单元中 VCFReader 之前被定义,并且您不能从 undefined/incomplete 类型继承。编译器 必须 在从它继承的任何 class 之前看到 VCFReader 的定义。 (这是 "base class undefined" 错误的来源。)

VCFReader的定义不依赖于具体版本实现的定义,所以连循环包含都没有必要。要解决循环问题,您可以删除这两行:

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

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

转换错误 (cannot convert from 'VCFReader2_1 *' to 'VCFReader *') 是 "base class undefined" 错误的副作用——因为编译器不知道 VCFReader 是什么,而 reader 版本 classes,它认为它们不是从 VCFReader 继承的,因此它认为您不应该能够向上转换指针。解决 "base class undefined" 错误也应该解决这些转换错误。