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

时间:2012-07-24 22:10:04

标签: c++ osx-lion static-libraries header-files

我创建了一个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也没有警告)。

2 个答案:

答案 0 :(得分:5)

这不起作用并且违反单定义规则:每个类必须只有一个定义,每个翻译单元必须看到完全相同的定义,否则您的程序会生病 - 形成,更糟糕的是,不需要诊断。

使用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(); }

请参阅Herb Sutter的GotW #101,了解PIMPL类的通用框架。

答案 1 :(得分:0)

您不能从接口中删除类的私有/受保护部分:使用接口的编译器必须知道(私有/受保护)成员变量和虚函数,否则它会错误地了解类实例和虚拟表。