当前位置: 首页 > 知识库问答 >
问题:

在另一个项目中包含继承的类时,与抽象类发生链接器错误

壤驷阳波
2023-03-14

如果我有一个抽象

像这样:

#pragma once
#include <string>

class BaseObject
{
public:
    virtual std::string to_string() = 0;
};

一些类扩展了这个类。

#pragma once
#include "baseobject.h"

class Point : BaseObject
{
public:
    Point() {}
    ~Point() {}
    Point(float _x, float _y) : x(_x), y(_y) {}

    std::string to_string();

    float x, y;
};

在同一项目中,我可以在派生类的cpp文件中实现to_string函数,但当我想在同一解决方案中的另一个项目中使用该类时,我得到一个链接器错误

错误LNK2001:未解析的外部符号“public:virtual class std::basic_string ,class std::allocator >__cdecl point::to_string(void)”(?to_string@point@@ueaa?av?$basic_string@du?$char_traits@d@std@@v?$allocator@d@2@@std@@xz)1>路径\to\circleht_test.exe:致命错误LNK1120:1未

一旦我将实现移到头文件中,一切都很好。这是为什么?我应该总是在派生类的头中实现纯虚函数吗?


共有1个答案

段坚
2023-03-14

在同一个项目中,我可以在扩展类的cpp文件中实现to_string函数,但当我想在同一个解决方案中的另一个项目中使用该类时,我得到一个链接器错误。

point::to_string实现的源代码在某个实现文件中,可能称为point.cpp。该文件包含在项目的源文件列表中。因此,当您生成项目时,它会被编译到point.obj文件中,该文件包含函数的二进制代码。链接器最终使用该文件生成可执行程序。

当您生成不同的项目时,point.cpp不在源文件列表中。您在某处包含了point.h这一事实与此无关。将类分离为*.cpp*.h文件只是一种非常常见的惯例。如果您只是包含*.h文件,而没有确保将相应的*.cpp文件编译*.obj文件,那么结果与您在这里遇到的情况完全相同:未创建point.obj,因此链接器会正确地抱怨缺少定义。

最干净的解决方案是将第一个项目或第一个项目的部分转换为库项目,该库项目内置到*.lib文件中。然后,应该将*.lib文件添加到需要它的每个应用程序项目的链接器依赖项中。

一旦我将实现移到头文件中,一切都很好。这是为什么?

因为在这种情况下,函数的实现是内联的,并且包含头文件的其他项目中的每个*.cpp文件都将获得它。

最后,请注意,这个答案有些特定于Visual Studio/Visual C++,尽管构建过程的基本思想通常与每个工具集都是相同的。

 类似资料:
  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 我正在用两个实体构建web应用程序: 漫画-id、标题、发行日期、封面id、流派、作者、卷等 这两个类继承自抽象类书。Book类将为这两个类提供公共变量:id、title、releaseDate、coverID; 我正在使用Pattern Builder创建漫画和体积对象。但当我试图设置描述时,我得到了以下错误: 图书类: 公开摘要类书籍 我的漫画课: 或者有更好的解决方案吗? 谢谢

  • 在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。 在继承中,我们为了提高程序的可复用性,引入的继承机制。当时的继承是基于类的。interface接口同样可以继承,以拓展原interface。 接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法

  • 问题是: 我有一个叫做Schema的基类,它是抽象的,它是一个未生成的类。我有两个从Schema继承生成的JAXB类:FixedWidthSchema和DelimitedSchema。 我使用外部绑定(xjb)文件来指定XSD和Java类之间的映射。 在基类模式中,我定义了几个方法: 公共架构静态创建(Model m),它从提供的模型创建架构。 公共抽象Writer marshal(),它将当前架

  • 所以我有一个多项目设置,看起来像这样