<分区>
我有两个这样定义的类:
类
class A {
A(A& a) { ... } // deep copy
<dtor + methods>
protected:
A(std::shared_ptr<AImpl>& pp) : p(pp) { /* empty */ }
std::shared_ptr<AImpl> p; // the only member variable of A
}
class B : public A {
explicit B(const A& a) : A(a.p) { /* empty */ } // KO
// OR
explicit B(const A& a) { p = a.p; } // KO
// OR
explicit B(const A& a) : p(a.p) { /* empty */ } // obviously KO
<members, ...>
}
注意:
A(A& a)
正在对 p
指向的对象进行深拷贝,这不是我需要的,所以我实现了 A(std::shared_ptr<AImpl>&)
初始化 A::p
使用共享指针本身的拷贝来共享所有权。
我无法为 A::p
定义 setter因为AImpl
不能是公共(public)类型并且必须保留在类 A
的范围内或其子类(接口(interface)-实现类分离设计)。
问题:
我在上面提到的所有构造函数风格上都有一个编译错误,说 p
不可访问,因为它在基类中受到保护,但为什么呢?