如何创建一个可以操作同一类的多个对象的函数,访问 C++ 中的私有属性?
Posted
技术标签:
【中文标题】如何创建一个可以操作同一类的多个对象的函数,访问 C++ 中的私有属性?【英文标题】:How to create a function that can operate over multiple objects of the same class, accessing private attributes in C++? 【发布时间】:2014-02-15 21:19:46 【问题描述】:假设我有一个 C 类,具有一些私有属性,例如整数 j。我主要创建了该类的两个对象,比如说 A 和 B。我需要对这些对象的一个私有属性进行操作(可能使用函数)。例如,任务可以是在 A.j 中写入值 2*(B.j)。我不能简单地实现一个 write 方法和一个 read 方法,因为它是一个更复杂的 MPI 相关问题。是否可以实现一个在输入中接收两个对象并对其私有属性“做一些工作”的函数?我必须在类的其他方法中声明它吗? 谢谢。
【问题讨论】:
请展示一些您正在尝试的示例代码。 你不能从类外访问私有成员,这就是私有成员的意义。 @Malloc 可以,只是不像成员函数那样直接返回对私有数据的引用。或通过some other magic 兄弟对象是彼此打开的书。私有、受保护和公共问题是继承问题。 定义:“兄弟”对象。同一类的两个实例。兄弟姐妹可以访问另一个实例的任何属性(数据或方法),只要提供指向该实例的指针。 【参考方案1】:您可以使用friend
函数访问private
和protected
类成员。
class C
int j;
friend void f(C& a, const C& b);
;
void f(C& a, const C& b)
a.j = 2*b.j;
是的,你必须在类定义中声明朋友。
但是,根据您具体尝试执行的操作,这可能不是最佳解决方案。
【讨论】:
谢谢:这正是我要找的。span> 【参考方案2】:为什么不直接实现get
和set
方法呢?那将是最简单的解决方案...
class A
int j;
public:
int getJ()return j;;
void setJ(int j2)j=j2;;
;
int main()
A B,C;
C.setJ(B.getJ()*2);
return 0;
或参考:
class A
int j;
public:
int& access()return j;;
;
int main()
A B,C;
C.access() = B.access()*2;
return 0;
或使用好友功能:
void doSomething(A &a, A &b)b.j = a.j*2;;
class A
int j;
friend doSomething(A &a, A &b);
【讨论】:
【参考方案3】:由于我不知道您要做什么,因此我不知道以下解决方案对您的情况是否有意义。您可以尝试类似“命令模式”之类的方法,传递一个函数,告诉您如何根据另一个对象的 j 计算 j 的新值(如果语法对您来说很奇怪,请在 google 中查找“lambda 函数”):
class MyClass
private:
int j;
public:
void ModifyBasedOnOtherObject (
const MyClass & other,
const std::function<int (int)> & f
)
this->j = f (other.j);
;
// ...
a.ModifyBasedOnOtherObject (b, [] (int i) return 2 * i; );
【讨论】:
以上是关于如何创建一个可以操作同一类的多个对象的函数,访问 C++ 中的私有属性?的主要内容,如果未能解决你的问题,请参考以下文章