0

这会很棘手,因为我不能发布任何真正的代码,但这里是:

我有 A->B->C 形式的继承,其中 C 是我正在编写的从 B 继承的类,B 从 A 继承。A 和 B 都是由其他人编写的,我无法更改它们(它们似乎独立工作)。我还有一个TestC 类,它#includes Ch 因为它创建了一个用于测试的对象;C 类为空,TestC 只创建一个 C 对象。当我在 Visual Studio 2013 中构建我的 TestC 项目时,出现 lnk2001 错误;如果我注释掉#include Ch,这些就会消失 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错误是说他们在Ah中找不到虚函数的定义,也找不到Bh的构造函数、解构函数和一个函数(非虚函数)我可以打开A&B的.h/.cpp文件和查看它抱怨被定义的功能。TestC 的包含目录包含这些(我可以通过单击#includes 打开它们,所以它可以工作)。为构建顺序设置项目依赖项。从编程的角度来看,C 并不真的需要从 B 继承,但是上级做出了决定,而我的苦工无法改变它。我猜这与我不知道的继承和/或虚函数的一些细微差别有关。

我错过了什么?我觉得我已经阅读了大多数 Stack Overflow 文章......

编辑:每一个都在他们自己的项目中,除了TestC是一个.lib,TestC是一个.exe。当我在同一个项目中使用这个基本代码时,它编译没有错误,所以我认为这是 C 和 TestC 项目之间的问题。

4

0 回答 0