我正在尝试使用以下示例代码:
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以及如何清除它?

在此先感谢您的帮助!

最佳答案

您遇到的问题是,特定版本的阅读器类是在至少一个编译单元中的VCFReader之前定义的,并且您不能从未定义/不完整的类型继承。编译器必须在从其继承的任何类之前查看VCFReader的定义。 (这是“未定义基类”错误的来源。)

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

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


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

转换错误(cannot convert from 'VCFReader2_1 *' to 'VCFReader *')是“未定义基类”错误的副作用-由于编译器在遇到阅读器版本类时不知道VCFReader是什么,因此它不认为它们继承了来自VCFReader,因此它认为您不应该能够向上移动指针。解决“未定义基类”错误也应解决这些转换错误。

10-06 09:12