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
。)
由于我是 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
。)