如何创建一个可以在同一个类的多个对象上运行的函数,在C ++中访问私有属性?

时间:2014-02-15 21:19:46

标签: c++ function class object methods

假设我有一个C类,带有一些私有属性,例如整数j。在主要的我创建该类的两个对象,让我们说A和B.我需要在这些对象的一个​​私有属性上操作(可能使用一个函数)。例如,任务可以是在A.j中写入值2 *(B.j)。我不能简单地实现一个write方法和一个read方法,因为它是一个更复杂的MPI相关问题。是否有可能实现一个函数,在输入中接收两个对象并对其私有属性“做一些工作”?我必须在类的其他方法中声明它吗? 谢谢。

3 个答案:

答案 0 :(得分: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;
}

是的,您必须在类定义中声明好友。

但是,根据您的具体操作,这可能不是最佳解决方案。

答案 1 :(得分:0)

为什么不实施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);
}

答案 2 :(得分:0)

由于我不知道您要做什么,我不知道以下解决方案是否适用于您的情况。你可以尝试类似“命令模式”的东西,传递一个函数来告诉你如何从另一个对象的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; });