我正在尝试使用以下示例代码:
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
,因此它认为您不应该能够向上移动指针。解决“未定义基类”错误也应解决这些转换错误。