这将是棘手的,因为我无法发布任何真实的代码,但这里有:
我有A-> B-> C形式的遗产,其中C是I类继承自B的写作,B继承自A. A和B都是由其他人写的我无法改变它们(它们看起来是独立的)。我还有一个TestC类,#includes C.h因为它创建了一个可以测试的对象; C类为空,TestC只创建一个C对象。当我在Visual Studio 2013中构建我的TestC项目时,我得到lnk2001错误;如果我把#include C.h.评论出来,这些就会消失。 C项目没有问题编译。
A.h
#pragma once
class A {
public:
A() {};
virtual ~A() {};
virtual int SomeGoodFunction() {return 0;};
virtual int BadFunction() {return 0;}; //lnk 2001: unresolved external
private:
virtual int SomeOtherFunction() {};
virtual int SomeOtherBadFunction() {}; //lnk 2001: unresolved external
};
B.h
#pragma once
namespace Model {
#include "A.h"
class B : public A {
public:
B() {}; //lnk 2019: unresolved external referenced in C()
virtual ~B() {}; //lnk 2019: unresolved external referenced in ~C()
private:
void Bad() {}; //lnk 2001: unresolved external
virtual ThisFunctionWorks() {};
void SoDoesThis() {};
};}
C.h
#pragma once
#include "B.h"
class C : public B {
friend class TestC;
public:
C() {};
~C() {};
int Initialize() {};
};
TestC.h
#pragma once
#include "C.h"
namespace Model {
class TestC {
int Test();
};
}
TestC.cpp
#pragma once
#include "TestC.h"
namespace Model {
int TestC::Test() {
C test = C(); //if I comment out, builds just fine
return 0;
}
}
(Ah& Bh有相应的.cpp'其中的内容是定义的,但内容并不相关,我不会想;它所抱怨的每个功能都有已经在.cpp中定义了(我可以点击'视图定义' VS会跳转到它。请原谅任何语法错误;我把它写成伪代码,因为我在编译后得到了链接器错误语法,我很确定它们不会存在于原始代码中。)
lnk2001错误表示他们无法在A.h中找到虚函数的定义,并且无法找到B.h.的构造函数,解构函数和一个函数(非虚函数)。我可以打开A& B' .h / .cpp文件,看看它抱怨被定义的功能。 TestC包含了包含这些目录的目录(我可以通过点击#includes打开它们,以便它正常工作)。为构建顺序设置项目依赖项。从编程的角度来看,C并不是真的需要从B继承,但是更高的人做出了决定而我的peon自己无法改变它。我猜测它与遗传和/或我不知道的虚函数的细微差别有关。
我错过了什么?我觉得我已经浏览了大多数Stack Overflow文章......
编辑:每个都在他们自己的项目中,除TestC之外的所有内容都是.lib,TestC是.exe。当我在同一个项目中使用这个基本代码时,它编译时没有任何错误,所以我认为它是C& C之间的一个问题。 TestC项目。