【问题标题】:Erros while trying to make factroy method with c++尝试使用 C++ 创建工厂方法时出错
【发布时间】:2017-09-11 15:26:14
【问题描述】:

我正在尝试使用此示例代码: 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 'return':无法从 'VCFReader2_1 *' 转换为 'VCFReader *' vcfreader.cpp 11

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

多次

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

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

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

提前感谢您的帮助!

【问题讨论】:

    标签: c++ design-patterns methods factory


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 将这些包含在 cpp 文件中后,一切正常。谢谢!这解决了错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多