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

このような質問を見て、その理由を尋ねます。クラス A とクラス B の間には、int があるという以上の関係はないようです。

これをコンパイルする方法は、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

friendお互いにクラスを作ることができます。

しかし、コメントで指摘されているように、ほとんどの場合、それはかなり恐ろしいことです。メンバーである理由は、private外部の関係者が直接アクセスしてはならないためです。

そのため、使用可能なand にoperator==()オーバーロードを追加する(つまり、メソッド) か、アクセサを追加して外部比較用の値を返します。ABbool A::equal(const B&) const;

于 2012-09-12T12:24:53.707 に答える
0

2つのクラス(c & a , c & b)と友好関係を築き、比較します。

于 2012-09-12T12:25:03.360 に答える
0

AandBを作成したり、 and のクラスにメソッドをC追加したりできます。int GetVar() constAB

于 2012-09-12T12:28:41.273 に答える
0

それらが非公開であり、いかなる種類の公開インターフェースからもアクセスできない場合、概念的に共通点がないことを意味します。publicgetAA getBBを追加し、それを使用してオブジェクト間のコンパレーターを作成します。私は友情が嫌いです。多くの。

于 2012-09-12T12:25:11.757 に答える
-1

なぜこれが必要なのですか?

動作とデータを組み合わせます。

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

リクエストの関連性、または推定される根本的な理由の代替案についてコメントすることなく、Reflectionを通じてプライベートメンバーを比較できると思います。

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

etcetera

于 2012-09-12T12:47:47.933 に答える