我正在阅读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;
};
然后他说:
当对象引用和指针执行时,避免使用对象。您 可以定义仅具有声明的类型的引用和指针 对于类型。定义类型的对象需要存在 类型的定义。
有没有不能使用引用或指针的时候?难道你不能使用你设计的所有类的疙瘩成语吗?
答案 0 :(得分:1)
某些上下文需要完整类型。例如:当你想在一个向量中按值存储对象时:
std::vector<Person> persons; // Person must be complete
你不能在这里使用引用,并假设你想避免空人(= nullptr)。
请注意,据我所知,现在可以避免使用pimpl成语,因为增加了复杂性,性能和存储损失。