繁体   English   中英

为C ++类创建最小的发布就绪头文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM