公共头类构造函数 我是新建C++分布式图书馆的新手,我有点迷路了。 我创建了一个.cpp文件,其中包含我希望库为用户提供的所有函数的包装器,我还编写了2个.h文件,一个公共文件和一个私有文件。下面是我的头文件的一个虚拟示例: 公共卫生: private.h:

公共头类构造函数 我是新建C++分布式图书馆的新手,我有点迷路了。 我创建了一个.cpp文件,其中包含我希望库为用户提供的所有函数的包装器,我还编写了2个.h文件,一个公共文件和一个私有文件。下面是我的头文件的一个虚拟示例: 公共卫生: private.h:,c++,C++,请注意,public\u function()的实现在代码中使用了“instanceofClass”。 我已经能够使用私有类毫无问题地编译代码,并且能够使用公共头和已编译库编译并链接库与外部程序。不过,在执行该代码时,我会遇到分段错误,我怀疑这与“instanceofClass”缺少正确初始化有关 我做的对吗?我是被迫在public\u function()的实现中实例化“instanceofClass”以正确初始化它,还是应该做其他事情 非常感谢。公开定义的myclass。h没有成员,因此大小

请注意,
public\u function()
的实现在代码中使用了“instanceofClass”。 我已经能够使用私有类毫无问题地编译代码,并且能够使用公共头和已编译库编译并链接库与外部程序。不过,在执行该代码时,我会遇到分段错误,我怀疑这与“instanceofClass”缺少正确初始化有关

我做的对吗?我是被迫在
public\u function()
的实现中实例化“instanceofClass”以正确初始化它,还是应该做其他事情


非常感谢。

公开定义的
myclass
。h没有成员,因此大小为1字节。private.h中定义的
myclass
封装了
另一个类
,因此它是另一个类的大小。这种不一致是你问题的根源


您应该做的是只有一个头,并使用指针(不需要类定义)来隐藏另一个类的实现。我将重复Joachim的链接以进行详细说明。

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

公共卫生

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();
}
二等兵

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

类别的定义不应在不同的翻译单位之间改变。这是“一个定义”规则的一个方面。您可能想做的是定义公共可见类,使其具有指向私有实现的指针:Pimpl习惯用法:

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

结构Impl只能在实现文件中定义。

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


如果您想隐藏
instanceofClass
的实现细节,只需在头中做一个转发声明(您提供的私有头是正确的,您可以将其用作公共头),并在代码中的某个地方提供一个实现。

您似乎正在实现。您不应该有两个相同类型的不同定义,否则您的实例在内存中的大小将不正确。改用Pimpl。谢谢,它很有效。我不得不发现我需要将private.h包含到public.cpp中
class myclass_private {
    public:
        void private_function(); 
};
class Public {
public:
    ...
private:
     struct Impl;
     Impl* impl_;
};