gpt4 book ai didi

C++ DLL : Not exposing the entire class

转载 作者:太空宇宙 更新时间:2023-11-04 14:43:06 25 4
gpt4 key购买 nike

我如何“隐藏”类的某些部分,以便使用该库的人不必包含我的类中使用的所有类型的 header 。即采用下面的 MainWindow 类,我可以拥有它吗,所以当在静态/动态库中编译时,使用该库的人不必包含 windows.h,即不必定义 HWND、CRITICAL_SECTION、LRESULT 等.

我知道我可以将它分成两个类,一个只有公共(public)接口(interface)的抽象类,以及一个包含需要 windows.h 的成员的隐藏实现类。

这里的问题是visible类不能再自己创建,需要一个额外的创建函数(例如CreateMainWindow)。在这种情况下这很好,因为最有可能只需要在堆上创建一个实例,但对于其他类则不需要。

class MainWindow
{
HWND hwnd;
int width, height;
std::string caption;
bool started,exited;
bool closeRequest;

unsigned loopThread;
CRITICAL_SECTION inputLock;

Input *input;
public:
static void init_type();
Py::Object getattr(const char *name);

MainWindow(int width, int height, std::string caption);
~MainWindow();

bool CloseRequest(const Py::Tuple &args);
bool CloseRequestReset(const Py::Tuple &args);

HWND GetHwnd();

int GetWidth();
int GetHeight();

Input* GetInput();
protected:
unsigned static __stdcall loopThreadWrap(void *arg);
unsigned LoopThreadMain();

LRESULT WndProc(UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT static CALLBACK WndProcWrapper(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
};

最佳答案

您可以使用所谓的“柴郡猫”、“信封/信封”或“pimpl”技术(它们都是同一技术的不同名称)隐藏类的某些部分:

class MainWindow
{
private:
//opaque data
class ImplementationDetails;
ImplementationDetails* m_data;
public:
... declare your public methods here ...
}

最好的方法可能是你第 2 段中提到的抽象类(但是我​​没能理解你的最后一句话,你在其中(试图/未能)解释你对此的反驳是什么)。

关于C++ DLL : Not exposing the entire class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/425400/

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