文件和疙瘩成语之间的编译依赖关系

时间:2015-05-11 20:39:29

标签: c++

我正在阅读Scott Meyers的Effective C ++,我对第31项“最小化文件之间的编译依赖性”提出了疑问。

在一个例子中,他展示了疙瘩成语:

#include <string> // standard lib shouldn't be forward-declared

#include <memory>

class PersonImpl;  // Forward decl of Person impl.class

class Date;        // forward decls of classes used in Person interface
class Address;

class Person
{
public:
    Person(const std::string& name, const Date& birthday, const Address& addr);
    std:string name() const;
    std:string birthDate() const;
    std:string address() const;
    ...
private:
    std::tr1::shared_ptr<PersonImpl> pimpl;
};

然后他说:

  

当对象引用和指针执行时,避免使用对象。您   可以定义仅具有声明的类型的引用和指针   对于类型。定义类型的对象需要存在   类型的定义。

有没有不能使用引用或指针的时候?难道你不能使用你设计的所有类的疙瘩成语吗?

1 个答案:

答案 0 :(得分:1)

某些上下文需要完整类型。例如:当你想在一个向量中按值存储对象时:

std::vector<Person> persons; // Person must be complete

你不能在这里使用引用,并假设你想避免空人(= nullptr)。

请注意,据我所知,现在可以避免使用pimpl成语,因为增加了复杂性,性能和存储损失。