c++ - 无法从派生类构造函数参数访问受保护的基类成员
问题描述
我有两个这样定义的类:
课程
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
我不能为它定义一个setter,A::p
因为AImpl
它不能是公共类型,并且必须A
只保留在类或其子类的范围内(接口-实现类分离设计)。
问题:
我对上面提到的所有构造函数风格都有一个编译错误,说它p
是不可访问的,因为它在基类中受到保护,但为什么呢?
解决方案
当访问被禁止时,您尝试访问A::p
的不是 的基础B
,而是另一个对象的基础。
您可以改为提供受保护的构造函数:
class A {
A(A& a) { ... } // deep copy
<dtor + methods>
protected:
A(const A& a, int) : p(a.p) { /* empty */ }
std::shared_ptr<AImpl> p; // the only member variable of A
};
class B : public A {
explicit B(const A& a) : A(a,0) { /* empty */ }
<members, ...>
};
推荐阅读
- string - 如何使用脚本处理 CSV 文件第一列中的文本
- angular - Ionic 2 / Angular 2 中的垂直刷卡
- c++ - C++ 中外部库的命名空间
- angularjs - AngularJS - 删除请求无法正常工作
- javascript - 使用 javascript 检索 URL 方案
- python - 使用 2d numpy 掩码 np.where 来寻址 3d numpy 数组(pythonic??)
- spring - Spring MVC GetMapping 不生效
- c# - SkAndroidCodec::NewFromStream 返回 null System.IO.Stream Xamarin Android
- ios - 如何检测一个 sknode 悬停在另一个上?
- c# - 在序列化为 JSON 之前将值分配给动态数量的子类