2

我有 2 节课:

class A
{
    int aa;
};
class B
{
    int bb;
};
class C
{
    public:
        bool equal(A& av,B& bv)
        {
            return (av.aa==bv.bb);
        }
};

当然,C类有私有成员访问的编译错误原因。有没有办法实现equal()C 类的那个成员?

4

9 回答 9

10

一个好的解决方案可能是在 A 和 B 类中提供 getter。这样你就可以把所有东西都封装起来。例如

class A
{
    int aa;
    public:
     int GetAA()
     {
       return aa ;
     }

};
于 2012-09-12T12:26:44.760 回答
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);
}
于 2012-09-12T12:28:43.800 回答
4

我看到这样的问题,我问为什么。除了它们有一个int之外,A类和B类之间显然没有任何关系。

进行这种编译的方法是使 C 成为 A 和 B 的朋友,或者至少使 C 中的 equal 函数成为 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 的任何成员——它完全不相关。(根据您的片段)。

基本上 - 你就是这样做的。但不要在没有很多想法的情况下这样做。仅仅因为苹果和橙子都有点数,并不意味着比较点数有很多意义。

于 2012-09-12T12:32:21.647 回答
2

您可以使类friends 彼此。

但是,正如评论中指出的那样,在大多数情况下,这非常可怕。成员private必须是因为外部各方不应该直接访问它的原因。

因此,要么添加可使用的operator==()重载ABbool A::equal(const B&) const;方法),要么添加访问器以返回值以供外部比较。

于 2012-09-12T12:24:53.707 回答
0

与两个班级(c & a , c & b) 建立友谊,然后进行比较。

于 2012-09-12T12:25:03.360 回答
0

如果它们是私有的并且不能通过任何类型的公共接口访问,则从概念上讲,它们没有任何共同点。所以添加 publicgetAA getBB并用它来做对象之间的比较器。我不喜欢友谊。很多。

于 2012-09-12T12:25:11.757 回答
0

您可以A与类B成为朋友C或添加int GetVar() const方法。AB

于 2012-09-12T12:28:41.273 回答
-1

你为什么需要这个?

将行为与数据结合起来。

class C
{
public:
    void doSomething()
    {
        if(aa == bb) {
            doThis();
        } else
            doThat();
        }
    }
private:
    int aa;
    int bb;
};
于 2012-09-12T12:30:49.173 回答
-2

在不评论请求的相关性或假定的根本原因的替代方案的情况下,我相信您可以通过反射比较私人成员:

FieldInfo AInfo = av.GetType().GetField("aa", BindingFlags.NonPublic | BindingFlags.Instance);
int AValue = (int) AInfo.GetValue(av);

等等

于 2012-09-12T12:47:47.933 回答