使用常量指针来避免包含

时间:2016-05-15 18:47:17

标签: c++ pointers include const member

我的目标是通过最小化包含来减少编译时间,同时保持对类范围内的内存分配的控制。

实例化方法

foo.h中

#include "Bar.h" //unneccessary if only number is used in a given source file
struct Foo
{
    Bar bar;
    int number;
};

常量指针方法

foo.h中

struct Bar; //no include, to use Bar Bar.h must also be included
struct Foo
{
    Bar *const bar;
    int number;
    Foo();
    Foo(const Foo&) = delete;
    ~Foo();
};

Foo.cpp中

#include "Bar.h"
Foo::Foo()
 : bar(new Bar()) 
{
}

Foo::~Foo() 
{
    delete bar; 
}

使用像这样的常量指针而不是实例变量还有其他注意事项吗?或者也许是替代方法?

1 个答案:

答案 0 :(得分:0)

这是最小化标头包含的完全合法且标准的方法。实际上,一种似是而非的方法是始终通过指向结构的不透明指针访问所有私有成员,以便公共标题只是

namespace detail {
    struct xxFoo_impl;
}

class Foo {
    detail::xxFoo_impl* xx;
    public:
    // ... stuff ...
};

然后,在 Foo.cpp 中,xxFoo_impl定义了所有成员变量,构造函数在堆上分配xx,并且所有对变量的访问都是通过xx指针。这样,对类的私有成员的更改不会影响代码的任何客户端:标头未更改,无需重新编译。

因此,不仅可以使用指针来减少标题中的内容,甚至可以推荐。 ; - )

但是,如果Foo的所有用户都希望访问Bar成员,那么就没有意义,因为无论如何他们都将包括bar.h