c++ - 如何声明已在静态库中定义的类?

标签 c++

我正在链接一个静态库,它封装了 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->idOpen()它打印分配给 id 的值在 A() .唯一的问题是 _hal我在 A() 中分配了内存分配后我看到它是有效的,但我在 Open() 中打印它的地址它显示 0xa这显然不是有效地址,而在 A()地址是

enter image description here

*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/

相关文章:

c++ - 接收UDP广播

c++ - 将基类对象分配给派生类

c++ - std::__gcd 和 std::gcd 有什么区别?

c++ - log4cplus: ERROR 在默认上下文被销毁后重新初始化默认上下文

C++ Windows 已触发断点 - 堆损坏

c++ - 在 .o 文件中本地化函数体 block

c++ - 无法在初始化中将 'Date' 转换为 'int' 错误

c++ - 使用 Cygwin 编译 c++ wxWidgets

c++ - 没有特殊字符的密码验证器

c++ - C++ 中带有 typedef 和模板的常量引用