尝试使用 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" 错误也应该解决这些转换错误。
我正在尝试使用这个示例代码: 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" 错误也应该解决这些转换错误。