公共头类构造函数
public header class constructor
我是构建用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
的实现细节,只需在头中进行前向声明(您提供的私有头是正确的,您可以将其用作公共头),并在代码中的某个位置提供实现。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为