我有2个课程:
class A
{
int aa;
};
class B
{
int bb;
};
class C
{
public:
bool equal(A& av,B& bv)
{
return (av.aa==bv.bb);
}
};
当然,C类有私人成员访问的编译错误原因。
有没有办法实现C类的equal()
成员?
答案 0 :(得分:10)
一个好的解决方案可能是在A和B类中提供getter。 这样你就可以保存所有内容。 e.g。
class A
{
int aa;
public:
int GetAA()
{
return aa ;
}
};
答案 1 :(得分:6)
这是使用friend
函数的一个很好的场景:
// forwarding references to each of the classes
class A;
class B;
class C
{
public:
bool equal(A& av,B& bv);
// notice we cannot implement equal() here,
// because A and B have not been defined yet,
// even though they have been declared.
};
class A
{
private:
int aa;
// Simply register to be a friend of A with our 'C::equal' function,
// so that we can access 'aa'
friend bool C::equal(A&, B&);
};
class B
{
private:
int bb;
// Once again, we register as a friend of C::equal,
// this time to access 'bb'
friend bool C::equal(A&, B&);
};
// finally, now that A and B have been fully defined,
// we can implement our equal method:
bool C::equal(A&av, B&bv)
{
return (av.aa == bv.bb);
}
// Sample Usage
int main()
{
A a = A();
B b = B();
C c = C();
c.equal(a, b);
}
答案 2 :(得分:4)
我看到这样的问题,我问为什么。除了他们有一个int之外,A级和B级之间显然没有任何关系。
进行编译的方法是让C成为A和B的朋友,或者至少在C中使A和B的朋友使用相同的函数(仔细使用前向声明)。
class A;
class B;
class C { static bool equal(A const &, B const &); };
class A { friend bool C::equal(A const &, B const &) };
class B { friend bool C::equal(A const &, B const &) };
bool C::equal(A& const &a, B const &b) { return a.a == b.b; }
请注意const限定符,因为比较运算符不太可能改变其输入。除此之外,我已经使它成为静态函数,因为它不使用C的任何成员 - 它完全不相关。 (根据你的片段)。
基本上 - 你就是这样做的。但是如果没有很多想法,就不要这样做。仅仅因为苹果和橘子都有点数,并不意味着在比较点数时有很多意义。
答案 3 :(得分:2)
您可以互相制作课程friend
。
但是,正如评论中指出的那样,在大多数情况下这是非常可怕的。成员private
的原因必须是因为外部各方不应直接访问它。
因此,可以将operator==()
重载添加到A
和B
可以使用(即bool A::equal(const B&) const;
方法),或者添加访问器以返回值以进行外部比较
答案 4 :(得分:0)
与两个班级(c& a,c& b)形成友谊,然后进行比较。
答案 5 :(得分:0)
如果它们是私有的,无法通过任何类型的公共接口访问,则从概念上讲它们没有任何共同之处。所以添加public getAA
getBB
并使用它来制作对象之间的比较器。我不喜欢友谊。很多。
答案 6 :(得分:0)
您可以让A
和B
成为C
的朋友,或将int GetVar() const
方法添加到A
和B
类。
答案 7 :(得分:0)
你为什么需要这个?
将行为与数据相结合。
class C
{
public:
void doSomething()
{
if(aa == bb) {
doThis();
} else
doThat();
}
}
private:
int aa;
int bb;
};
答案 8 :(得分:-2)
在没有评论请求的相关性或假定的潜在原因的替代方案的情况下,我相信您可以通过反思来比较私人成员:
FieldInfo AInfo = av.GetType().GetField("aa", BindingFlags.NonPublic | BindingFlags.Instance);
int AValue = (int) AInfo.GetValue(av);
诸如此类