gpt4 book ai didi

c++ - 我可以为 C++ 类提供不完整的 header 以隐藏实现细节吗?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:05 24 4
gpt4 key购买 nike

我想将一个类的实现分成三个部分,以避免用户需要处理实现细节,例如,我用来实现功能的库:

实现.cpp

#include <api.h>
#include <impl.h>
Class::Class() {
init();
}
Class::init() {
myData = SomeLibrary::Type(42);
}
Class::doSomething() {
myData.doSomething();
}

实现.h

#include <somelibrary.h>
class Class {
public:
Class();
init();
doSomething();
private:
SomeLibary::Type myData;
}

API.h

class Class {
Class();
doSomething();
}

问题是,不允许我为类定义重新定义 header 。当我仅在 api.h 中定义 Class()doSomething() 时,这也不起作用。


一个可能的选择是定义api.h 并且根本不在项目中使用它,而是安装它(并且不安装impl.h)。

明显的缺点是,我需要确保 api.himpl.h 中的常用方法始终具有相同的签名,否则程序使用该库将出现链接器错误,这是我在编译该库时无法预测的。

但是这种方法是否有效,或者我会遇到其他问题(例如,指向类成员的错误指针或类似问题),因为 obj 文件与 header 不匹配?

最佳答案

简短的回答是“不!”

原因:任何/所有需要使用您的 Class 的“客户”项目类必须具有该类的完整声明,以便编译器可以正确确定成员变量的偏移量等内容。

private的使用成员很好 - 客户端程序将无法更改它们 - 就像您当前的实现一样,其中仅在 header 中提供了成员函数的最简短概述,并在您的(私有(private))源文件中提供了所有实际定义。

一个可能的解决方法是在 Class 中声明一个指向嵌套类的指针 ,其中这个嵌套类只是在共享 header 中声明:class NestedClass然后你可以在你的实现中使用嵌套类指针做你喜欢的事情。您通常会将嵌套类指针设为 private成员;此外,由于它的定义未在共享 header 中给出,“客户端”项目访问该类(除了作为指针)的任何尝试都将是编译器错误。

这是一个可能的代码分解(可能不是没有错误,但是,因为它是一个快速输入):

// impl.h
struct MyInternal; // An 'opaque' structure - the definition is For Your Eyes Only
class Class {
public:
Class();
init();
doSomething();
private:
MyInternal* hidden; // CLient never needs to access this! Compiler error if attempted.
}

// impl.cpp
#include <api.h>
#include <impl.h>

struct MyInternal {
SomeLibrary::Type myData;
};

Class::Class() {
init();
}
Class::init() {
hidden = new MyInternal; // MUCH BETTER TO USE unique_ptr, or some other STL.
hidden->myData = SomeLibrary::Type(42);
}
Class::doSomething() {
hidden->myData.doSomething();
}

注意:正如我在代码注释中暗示的那样,使用 std::unique_ptr<MyInternal> hidden 会更好。 .但是,这需要您在 Class 中提供明确 定义。对于析构函数、赋值运算符和其他(移动运算符?复制构造函数?),因为它们需要访问 MyInternal 的完整定义。结构。

关于c++ - 我可以为 C++ 类提供不完整的 header 以隐藏实现细节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135096/

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