我正在链接一个静态库,它封装了 class A
的实现.
class A
{
private:
B* _hal;
int id;
public:
A();
bool Open();
}
这个类是
.cpp
编译为 .o
它们是生成的静态库的后期部分 libTony.a
.构造函数初始化id = 1023
并为 B* _hal
分配内存.我正在创建一个标题
libTony.h
仅提供声明(我希望)class A
{
public:
A();
bool Open();
}
在
main.cpp
#include "libTony.h"
int main()
{
A* o = new A();
o->Open();
return 0;
}
如果我使用 GDB,程序会正确地进入
A()
在 Open()
可在 libTony.a
中找到.如果我
p/x this
它在 A()
中显示相同的地址在 Open()
(意思是同一个对象),如果我 p/x this->id
在 Open()
它打印分配给 id
的值在 A()
.唯一的问题是 _hal
我在 A()
中分配了内存分配后我看到它是有效的,但我在 Open()
中打印它的地址它显示 0xa
这显然不是有效地址,而在 A()
地址是*this 的地址相同,id 相同,但指针不知何故丢失了?我想问题出在这一行
A* o = new A()
, A 的构造是正确的,但分配没有做我期望它做的事情,可能脚本正在查看 A
的定义在 libTony.h
?我想这是重新定义而不是仅仅声明?任何建议将不胜感激。
最佳答案
定义 A
作为库中的一个完整类,但是如果你不小心,通过头文件隐藏其中的方法将导致未定义的行为。
让我们用接口(interface)来做这件事。class A
继承自 InterfaceA
.把这个放在libTony.h
#pragma once
class InterfaceA
{
public
virtual bool Open() = 0;
virtual ~InterfaceA() = default; // or just "virtual ~InterfaceA() {}"
};
InterfaceA* CreateInstanceOfA();
然后在您的 CPP 文件中,将 A 类声明为:
class A : public InterfaceA
{
private:
B* _hal;
int id;
public:
A();
bool Open() override;
};
连同定义的辅助函数
InterfaceA* CreateInstanceOfA()
{
A* ptrA = new A();
return ptrA();
}
然后你的主要可以是这样的:
#include "libTony.h"
int main()
{
InterfaceA* o = CreateInstanceOfA();
o->Open();
delete o;
return 0;
}
关于c++ - 如何声明已在静态库中定义的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62188983/