C++如何实现仅允许特定类B修改类A的指定私有成员并限制其余访问
实现方案
原代码错误原因
- 你定义的友元全局
test函数没有接收A类实例作为入参,非静态成员变量a必须绑定到具体的A对象才能访问,因此触发invalid use of non-static data member报错。 - 直接将整个B类声明为A的友元会导致B可以访问A的所有私有成员,包括你不想开放的
a2,不符合权限最小化要求。 - 若将修改
a的方法放在A的public区,所有外部类包括C都能调用,自然不符合隔离要求。
正确实现思路
只将B类中负责修改a的特定成员函数声明为A的友元,这样仅该函数拥有A的a的修改权限,B的其他成员函数无法访问A的任意私有成员(包括a2),同时C类完全没有权限访问A的私有成员,满足你的所有权限要求。
注意C++的访问控制是类级别的,语法上无法完全禁止A自身的成员函数访问自己的私有成员,因此A侧不要编写修改a的成员函数即可满足「禁止A自身修改」的要求。
可运行参考代码
#include <iostream> // 第一步:前向声明A类 class A; // 第二步:定义B类,仅声明修改a的成员函数 class B { private: int b; public: // 注意参数要用A的引用,否则修改的是临时副本 void change_a_value(A& a_class, int new_int); }; // 第三步:定义A类,仅将B的指定成员函数设为友元 class A { private: int a = 0; int a2 = 0; // 仅友元B的change_a_value函数,不开放其他权限 friend void B::change_a_value(A& a_class, int new_int); public: int get_a() const { return a; } // 仅用于测试读权限,不需要可以删掉 }; // 第四步:类外实现B的修改函数,此时A已经完整定义,可以操作a void B::change_a_value(A& a_class, int new_int) { a_class.a = new_int; // 正常修改a // a_class.a2 = 10; // 放开这里会编译报错,B无法访问a2,符合要求 } class C { private: int c; public: // void change_a_value(A& a_class, int new_int) { // a_class.a = new_int; // 放开这里会编译报错,C没有访问权限,符合要求 // } }; int main() { A a_obj; B b_obj; std::cout << "修改前a的值:" << a_obj.get_a() << std::endl; b_obj.change_a_value(a_obj, 20); std::cout << "修改后a的值:" << a_obj.get_a() << std::endl; return 0; }
效果验证
- B类的
change_a_value可以正常修改A的私有成员a - B类其他成员函数尝试访问A的
a或a2都会触发编译错误 - C类任何成员函数尝试访问A的
a都会触发编译错误 - A类自身没有编写修改
a的成员函数,满足禁止A自身修改的要求
内容的提问来源于stack exchange,提问作者mikki
相关产品推荐
相关产品推荐

