公共头类构造函数

public header class constructor

本文关键字:构造函数      更新时间:2023-10-16

我是构建用C++编写的可分发库的新手,我有点迷失了方向。我已经为库提供给用户的所有函数创建了一个带有包装器的.cpp文件,并编写了两个.h文件,一个是公共文件,另一个是私有文件。下面是我的头文件的一个伪示例:

public.h:

class myclass
{
public:
public_function();
private:
}

private.h:

class myclass
{
public:
public_function();
private:
anotherClass instanceofClass;
}

注意,public_function()的实现在代码中使用了"instanceofClass"。我已经能够使用私有类毫无问题地编译代码,并使用公共头和编译后的库编译和链接库与外部程序。然而,在执行该代码时,我会遇到分段错误,我怀疑这与"类实例"缺乏正确初始化有关。

我做的事对吗?我是被迫在public_function()的实现中实例化"instanceofClass"以使其正确初始化,还是我应该做其他事情?

非常感谢。

不能用两种不同的方式声明同一个类'myclass'。必须有一个单独的类定义。如果要隐藏实现的API,则需要使用"Pimpl"习惯用法。所以您的公共类只有一个指向私有类的指针。例如:

public.h

class myclass_private;
class myclass {
private:
myclass_private* pimpl; 
public:
myclass();
void public_function();
};

public.cpp

myclass::myclass() {
pimpl = new myclass_private;
}
void myclass::public_function() {
pimpl->private_function();
}

private.h

class myclass_private {
public:
void private_function(); 
};

public.h中定义的myclass没有成员,因此大小为1字节。private.h中定义的myclass封装了anotherClass,因此无论anotherClass大小如何。这种不一致性是问题的根源。

您应该做的是只有一个标头,并使用指针(不需要类定义)来隐藏anotherClass的实现。我将重复约阿希姆关于皮条客习语的链接,以供详细阐述。

类的定义不应在不同的翻译单位之间发生变化。这是一个定义规则的一个方面。您可能想要定义一个公开可见的类,使其具有指向私有实现的指针:Pimpl Idiom:

class Public {
public:
...
private:
struct Impl;
Impl* impl_;
};

struct Impl将仅在实现文件中定义。

您的类缺少适当的构造函数,这意味着编译器将根据类定义的内容提供默认的构造函数。如果该定义在所有代码中都不一致,那么它就不会在任何地方以相同的方式进行初始化,并且可能会丢失一些数据。

如果您想隐藏instanceofClass的实现细节,只需在头中进行前向声明(您提供的私有头是正确的,您可以将其用作公共头),并在代码中的某个位置提供实现。