我基本上有标题问题。
#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'
我知道这是我的包括搞砸了,或者我甚至完全无法做出工厂模式。在线的所有例子都让我看起来像我做得对,他们只是从来没有包含的包括。我猜它是
我确实有所有头文件的警卫。此外,如果它有任何帮助,则所有链接器错误都在派生类中。
答案 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