gpt4 book ai didi

c++ - 共享库的公共(public) API 中的纯虚函数 (c++)

转载 作者:行者123 更新时间:2023-11-28 07:34:29 30 4
gpt4 key购买 nike

我创建了一个共享库,我正在另一个应用程序中使用它。共享库的核心功能之一是检查正在泄漏的对象的基类。

库中的代码如下:

// LeakCheck.hpp
#include <vector>
class LeakCheck
{
private:
static std::vector<LeakCheck*> objects;
public:
virtual const char *getClassName() const = 0;
LeakCheck();
~LeakCheck();
friend class LeakCheckMaster;
};

// LeakCheck.cpp
#include <iostream>
class LeakCheckMaster
{
~LeakCheckMaster()
{
if (LeakCheck::objects.size()>0) {
std::cerr << "Leaked objects:" << std::endl;
for (int i=0; i<LeakCheck::objects.size(); i++)
std::cerr << LeakCheck::objects[i]->getClassName() << std::endl;
}
}
} master;
std::vector<LeakCheck*> LeakCheck::objects;
LeakCheck::LeakCheck()
{
objects->push_back(this);
}
LeakCheck::~LeakCheck()
{
objects->remove(this);
}

测试应用程序将是:

#include "LeakCheck.hpp"


class Test : public LeakCheck
{
public:
const char *getClassName() const
{
return "Test";
}
};

int main()
{
Test *a = new Test();
return 0
}

但是,当我尝试链接应用程序时,我得到“对 LeakCheck::getClassName() 的 undefined reference ”。我确定我已经链接到共享库,因为其他功能可以正常工作。

这不是实际代码。我试图只留下对问题至关重要的代码。希望我没有错过任何东西。

那么为什么会出现这个链接器错误呢?如果我将它从纯虚拟更改为返回“未命名类”。输出将所有对象报告为“未命名类”,即使我已经实现了 getClassName() 函数。

跨共享库边界进行抽象是不可能的吗?

最佳答案

抽象方法也必须是虚拟的:virtual const char *getClassName() const = 0;

关于c++ - 共享库的公共(public) API 中的纯虚函数 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013332/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com