如何创建一个可以操作同一类的多个对象的函数,访问 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 函数访问privateprotected 类成员。

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】:

为什么不直接实现getset 方法呢?那将是最简单的解决方案...

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++ 中的私有属性?的主要内容,如果未能解决你的问题,请参考以下文章

java中同一个包下的两个类含有多个重名的方法,有的需要互相调用,有的只能调用本类的,该如何实现?

PostgreSQL的几个概念

VC++中不同函数的对象访问

C#如何封装字段

JS 创建对象的几种方式

ArrayList 包含同一个超类的不同对象 - 如何访问子类的方法