访问C++类protected成员报错,如何正确访问保护成员变量?
问题原因
C++ 中protected修饰的类成员,仅允许三类对象访问:
- 类自身的成员函数
- 该类的派生类的成员函数
- 被显式声明为友元的函数或类
你当前的Component类不属于上述三类范畴,因此直接通过Item->Quantity访问受保护成员会触发权限报错。
可行解决方案
方案1:添加public getter方法(最推荐,符合封装规范)
在Item类的定义中新增公开的读接口,代码修改如下:
items.h 修改
protected: int32 Quantity; // 新增public成员 public: int32 GetQuantity() const { return Quantity; }
component.cpp 修改
把访问Quantity的行替换为调用getter接口:
return ItemAddResult::AddedAll(Item->GetQuantity());
方案2:将Component声明为Item的友元(仅适合强关联业务场景)
如果Component和Item业务耦合度极高,确实需要频繁访问Item的受保护成员,可以在Item类定义中添加友元声明:
items.h 修改
class Item { // 其他成员定义 protected: int32 Quantity; // 新增友元声明 friend class Component; };
注意:友元会破坏类的封装性,非必要不建议使用。
方案3:调整继承关系(仅符合业务设计时使用)
如果业务逻辑中Component本身就是Item的派生类,只需要修改类定义为继承关系即可天然获得protected成员的访问权限:
class Component : public Item { // 类成员定义 };
额外注意
你当前代码中将参数名定义为Item,和类名重名,建议修改为InItem这类名称避免编译期的命名冲突问题。
内容的提问来源于stack exchange,提问作者Саша
相关产品推荐
相关产品推荐

