gpt4 book ai didi

c++ - 共享库中的 D 指针和组合类

转载 作者:行者123 更新时间:2023-11-30 05:23:23 24 4
gpt4 key购买 nike

我正在用 Qt5 C++ 创建一个共享库。为了允许 future 的更新保留二进制兼容性,我想使用 d 指针技术。但是,当有类的组合时,我不知道如何应用它。我找到的示例,包括一个 here ,只解释类继承的情况。我的问题是

Do I need to make a corresponding private class for each class in the library (myLib, B and C) or only for the main one (myLib) and how to access them later?

这是我的设置和没有私有(private)类的所需功能:

myLib.h

#include "B.h"

class myLib;
{
public:
myLib();
B *getB(int n);

private:
QList<B *> m_b;
}

B.h

#include "C.h"

class B;
{
public:
B();
C *getC(int n);
private:
QList<C *> m_c;
}

C.h

class C;
{
public:
C();
int getVar();
private:
int m_var;
}

在主应用的某处:

myLib *m_lib = new myLib();
int k = m_lib->getB(4)->getC(2)->getVar();

最佳答案

来自链接:“永远不要更改导出的 C++ 类”的问题。
解决方案:“诀窍是通过仅存储单个指针来保持库的所有公共(public)类的大小不变。该指针指向包含所有内容的私有(private)/内部数据结构数据。”。

只要您的类不显示给您的库的使用者,就可以随意使用无 D 指针。 “向消费者展示”是指“通过标题中的声明提供完整的定义,这些定义将包含在消费者代码中”。也许公共(public)/私有(private)术语在这里遭受“语义重载”,让我们使用“暴露”/“不透明”(参见 ** 脚注)

在您的示例中,BC 都已公开,因此它们必须“仅通过指针”可用。

myLib 类也是如此。更糟糕的是:myLib 的实例可以通过值获取,因为构造函数是public。这意味着我可以做类似的事情:

myLib libObj;
libObj.getB(4)->getC(2)->getVar();

这将使 myLib 的 future 版本无法“减少替换,无需重新编译”。


我建议强制消费者通过工厂方法获取 myLib 的实例(或使用“单例”)。在线的东西:

class myLib {
private:
myLib() {
}

public:

static myLib* createInstance() {
return new myLib();
}
};

** 作为“暴露/不透明声明”的示例 - class B 暴露给库消费者(他们知道 B -s 将有.. ahem...私有(private)部分),但是关于 class M 消费者只知道它存在并且库将提供指向它的指针:

文件“myLib.hpp”

// M_type is a pointer to a class and that's all you,
// the consumer, need to know about it. You give me an M_type
// and ask specific questions about it and you'll
// get the details or access to data I choose to
// make available to you
typedef class M * M_type;

// Dear the library consumer, this class is public to you.
// You know I'm keeping a list of M_type, even if you also know
// you'll never get you hands directly on that list, because
// it has a private access. But having this information,
// **you can compute the sizeof(B)**.
class B {
public:
B();

M_type getM(int n);

const M_type getM(int n) const;

// that is one of the "questions" you can ask about an M_type
const char* getMLabel(const M_type var) const;

// I'm providing you with access to something that allows
// you to modify the amount stored by an M_type,
// even if you don't know (and never will) how
// I'm storing that amount
int& getMAmount(M_type var);

// You don't need to know how to create M-s, I'll
// be doing it for you and provide the index of the created
// M_type. Ask me with getM to get that pointer.
inr registerM(const char* label, int amount);


private:
QList<M_type> ems;
};

某处,在库代码的深处,将存在一个定义class M 是什么的 header ,myLib.cpp 将包含它,但该 header 将是仅用于编译库,从未随 myLib binary 版本提供。因此,M 类 对库使用者来说是不透明的(相对于公开的)。

关于c++ - 共享库中的 D 指针和组合类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39199312/

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