用C ++实现工厂模式

时间:2016-08-16 19:47:28

标签: c++ include polymorphism factory base

我基本上有标题问题。

#include "Base.h"
class Factory
{
    public:
        static Base generateReply(int input);
};

然后是工厂cxx文件

#include "derived1.h"
#include "Factory.h"
Base Factory::generateReply(int input)
switch(input)
{
    case(0):
      return Base();
    case(1):
      return derived1();
    .....
}

然后我有基类头文件

class Base
{
   protected:
       std::string type;
   public:
       Base(){};
       Base(std::string in);
       virtual std::string doStuff();
}

连同它的cxx文件

#include "Base.h"
Base::Base(std::string in)
{
    type = in;
}

然后派生出一个类

#include "Base.h"
class derived1: public Base
{
    public:
       derived1();
       derived1(std::string in) : Base(in){};
       std::string doStuff();
}

后跟cxx文件

#include "derived1.h"

std::string derived1::doStuff()
{
  return type;
}

现在每个组件编译都很好。当我尝试将所有内容联系在一起时,一切都会出错。我得到了诸如

之类的东西

derived1.cxx:20:未定义引用`Base :: helper1(unsigned char) 其中helper1是一个受保护的方法,在Base(<我的代码中)存在于Base

甚至

derived1.cxx:28:未定义的对`derived1 :: helper2的引用(unsigned char,unsigned char) 其中helper2是我的代码中存在的派生私有方法。这是奇怪的,因为derived1编译得很好。您会认为在编译期间找到它的helper2方法会引发错误吗?

或者如果我乱用我的包含物,我会得到

错误:无法将'SenseType'从'SenseType'转换为'Response'

我知道这是我的包括搞砸了,或者我甚至完全无法做出工厂模式。在线的所有例子都让我看起来像我做得对,他们只是从来没有包含的包括。我猜它是

我确实有所有头文件的警卫。此外,如果它有任何帮助,则所有链接器错误都在派生类中。

3 个答案:

答案 0 :(得分:0)

所以我正在回答我自己的问题,因为其他人犯了同样的愚蠢错误。

所以对于底部的错误信息

derived1.cxx:20: undefined reference to `Base::helper1(unsigned char)

我在cxx文件中没有void base :: helper1(),我有一个无效的helper1()

我仍然不知道为什么它在编译期间没有抓住它?为什么在链接之前没有显示错误?

答案 1 :(得分:0)

对于你在自己的答案中提出的问题,我认为,因为你没有使用Base::在你的函数范围内将它视为一个全局函数,因此没有抱怨直到它试图链接文件。我之前遇到过这个问题,从那时起我就不得不养成在.cpp文件中包含的任何函数中使用范围的习惯。我希望这会有所帮助。

答案 2 :(得分:0)

如果不了解你的情况,我很难说,但我的猜测是你的代码正在编译,因为它在每个编译单元(每个单独的cpp / cxx文件)中仍然有效。

C ++允许你声明一些东西但不能定义它,它会编译得很好。只要没有引用未定义的内容,编译甚至链接都不会出错。

但是,如果您尝试引用未定义的内容,则会出现链接器错误。

示例:(Test.h)

class Test
{
public:
    int methodA();
    int methodB();
};

现在在Test.cpp

    #include "Test.h"
    int Test::methodA() { return 42; }

在这种情况下,编译单元&#34; Test.cpp&#34;会编译得很好。 但是,如果我们有一个Main.cpp,如下所示......

#include "Test.h"
void main()
{
    Test test;
    test.methodA(); // Works fine...
    // test.methodB() <-- Causes linker error if uncomented.    
}

因此,您可以轻松获得所有文件都可以“编译”的情况。他们自己,但在联系过程中遇到错误。

编辑以解决您的其他问题。 如果有,它将是编译器特定的。我不了解VisualStudio,但我相信GCC有这样的旗帜。见Force GCC to notify about undefined references in shared libraries