[英]Creating minimal release-ready header file for C++ class
我制作了一个C ++类,并将其放入自己的静态库中。
我还决定创建一个最小的头文件,该文件可让其他人看到public:
类的一部分。 因此,我基本上采用了原始头文件(相当长,包含类的private:
和public:
一部分,等等),并除去了public:
部分(很短,只有构造函数/析构函数和一项公共职能)。
为了测试,我创建了一个使用该库的虚拟项目。 关键是,每当我在该项目中使用最小头文件时,它就会崩溃,并显示以下消息:
test(44349) malloc: *** error for object 0x7fdab2c242e8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
但是只要我包含原始头文件,它就可以正常工作。
可能是什么问题呢? 它使用最小头文件和原始头文件都可以很好地编译(即使使用-Wall
也没有警告)。
那是行不通的,并且违反了一个定义规则 :每个类都必须只有一个定义,并且每个翻译单元必须看到完全相同的定义,否则您的程序格式错误,更糟的是,不需要诊断。
PIMPL惯用语可能会更好地为您服务,该惯用语将您的类分为两部分,并且不需要公开实现组件:
// Ship this:
class FooImpl;
class Foo
{
std::unique_ptr<FooImpl> impl;
public:
Foo();
void do_magic();
};
// Don't ship this:
class FooImpl { void magic(); };
void FooImpl::magic() { /* secret code */ }
Foo::Foo() : impl(new FooImpl) { }
void Foo::do_magic() { impl->magic(); }
有关PIMPL类的通用框架,请参见Herb Sutter的GotW#101 。
您不能从接口中删除类的私有/受保护的部分:使用该接口的编译器必须知道(私有/受保护的)成员变量和虚函数,否则会对类实例和虚表有错误的认识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.