1

我在 C 中有一些代码,以这种方式使用不完整的结构(简化示例):

某事.h

struct something;

struct something *new_something();
int work_a(struct something *something);
int work_b(struct something *something, const char *str);
void free_something(struct something *something);

一些代码.c

int some_function()
{
    struct something *something;
    int x;

    something = new_something();
    x = work_a(something);
    free_something(something);
    return x;
}

我在想,我这里基本上是在做 C++,为什么不试试用 C++ 写呢。问题是(我是 C++ 新手),我如何在 C++ 中实现相同的目标?如果我尝试添加声明不完整类的成员函数,我会得到

error: incomplete type 'something' named in nested name specifier

从铿锵。通过在头文件中编写完整的类,这将失去数据隐藏的全部意义,并且更改类中的私有变量将强制包括“something.h”在内的每个文件重新编译,我认为这里不需要。我不需要使用“something.h”的文件来知道这个结构/类的大小,我通常只需要一个指针就可以了。我怀疑它应该是这样的:

 class Something;

 Something::Something();
 Something::~Something();
 int Something::work_a(int x);

这样我就可以写出和 C 一样的东西,只是更短,更简洁。有任何 C++ 编码员希望启发这个凡人的 C 编码员吗?

4

3 回答 3

2

看看这篇文章:在 C++ 中隐藏实现细节。它应该让你指向你正在寻找的方向。请注意,继承被用于实现目标。还要了解在 C++ 中,结构是一个类,其所有成员都具有公共访问权限(包括函数、构造函数和析构函数)。至少,必须将接口声明为一个类,然后在 cpp 文件(而不是另一个头文件)内现在隐藏的类实现中从该类公开继承。

关于 Pimpl 设计模式,请查看这篇 Stack Overflow 文章:pimpl idiom vs. bridge design pattern。它也应该有所帮助。

于 2014-03-19T01:37:40.123 回答
1

实现这一点的一种方法是通过 Pimpl 设计模式,您可以在其中有一个指向只有您的实现知道的私有结构/类的指针。您的私有函数使用指针,理论上它可以大部分内联。

于 2014-03-19T01:25:19.647 回答
0

当您使用 new 语句分配内存时,编译器必须知道要分配多少数据空间。在你可以使用 new 创建Something 实例之前,编译器已经看到了Something 的数据大小。

在Something.h中使用类似的东西

class Something {
public:
 Something();

private:
 struct HiddenData;
 HiddenData* m_pHidden;
};

在Something.cpp中使用类似的东西

struct Something::HiddenData {
int a;
int b;

};

Something::Something() : m_pHidden(new HiddenData()) {
 m_pHidden->a = 1;
}
于 2014-03-19T01:50:12.683 回答