C++ 访问来自基 class 的两个 classes 的私有成员

C++ access private member in composition of two classes from base class

由于我是 C++ 的新手,所以开始吧!

我有一个基础 class(我没有在任何地方使用继承)和来自另外两个 classes 的两个对象。我需要从私人成员访问另一个 class.

class base
{
private:
    myClass1 m1;
    myClass2 m2;
public:
    base() {};
    ~base() {};
};

class myClass1
{
private:
    int m_member1;
public:
    myClass1() {};

    ~myClass1() {};
};

class myClass2
{
private:
    int m_member2;
public:
    myClass2() {};

    ~myClass2() {};

    int sum_members_because_yes(void)
    {
        return (myClass1::m_member1 + m_member2); //HOW CAN I DO THIS???
    }
};

如何从 myClass2 中的 myClass1 访问 m_member1? :)

(我想避免继承,因为在我的代码中 myClass1 和 2 不是基础 class...)

谢谢

我不是很清楚你想达到什么目的。我认为它是能够让两个 classes 在另一个 class 中保存数据,并具有 returns 两个 classes 数据的某种组合的功能。我将通过以下方式执行此操作:

#include <iostream>
using namespace std;

class B {
private:
    int mMember;
public:
    B(int aNumber) : mMember(aNumber) {}
    ~B() {}
    int getNumber() { return mMember; }
};

class C {
private:
    int mMember;
public:
    C(int aNumber) : mMember(aNumber) {}
    ~C() {}
    int getNumber() { return mMember; }
};

class A {
private:
    B mB;
    C mC;

public:
    A(B b, C c) : mB(b), mC(c) {}
    ~A() {}
    int sumMembers() {
        return mB.getNumber() + mC.getNumber();
    }
};

int main() {
    B b(2);
    C c(2);
    A a(b, c);

    cout << a.sumMembers() << endl; // prints 4

}

这里我们有两个包含数据的 classes(B 和 C),然后 class A 具有类型 B 和 C 的成员。returns 求和的函数应该是 class A 的方法,因为它包含 B 和 C 的实例。数据 classes 的私有数据通过 getter 访问,这允许访问数字但不能改变它的价值的能力。在我的示例中,B 和 C classes 是相同的。如果两个对象是相同 'thing' 的两个实例,那么它们应该是相同 class 的两个实例,而不是不同 class 的两个实例。我希望我已经回答了正确的问题。

有很多方法可以做到。

要完全允许访问 m_member1,您可以设置 m_member1 public。或者你可以声明一个 friend of myClass1 的东西,像这样:

class myClass1
{
private:
  int m_member1;
  ...
  friend class base;
};

或者这个:

class myClass1
{
private:
  int m_member1;
  ...
  friend class myClass2;
};

或者这个:

class myClass1
{
private:
  int m_member1;
  ...
  friend class int myClass2::sum_members_because_yes(void);
};

或者你可以给 myClass1 一个 public 访问器:

class myClass1
{
  ...
public:
  ...
  int get_m_member1() const
  {
    return(m_member_1);
  }
};

然后为了让 m2 到达 m1,你可以给 m2 一个指向 m1 的指针:

class myClass2
{
  ...
public:
  myClass1 *pm1;
};

class base
{
  ...
public:
  base()
  {
    m2.pm1 = &m1;
  };
};

或者您可以根据 m2 的要求通过 base 转发 m_member1 的值,但是这个答案越来越长了。

(一旦您对所有这些感到满意,您应该注意 sum_members_because_yes 确实属于 base。)