0

X と Y という 2 つのクラスがあります。

       X                                  Y 

    foo ( )                           bar ( )

Y は、X クラスで foo 関数のみを使用します。c++ で次のことができますか?

friend bool Y :: bar ( X & (X :: foo) )

つまり、オブジェクトの関数にY到達するだけの許可がありますか?fooX

EDIT:X & (X :: foo)使い方は正しいですか?

4

3 に答える 3

1

あなたの質問が正しく理解できれば、次のようなものが必要になります。

class X;

class Y {
public:
    void bar(X& x);
    void baz(X& x);
};

class X {
    void foo() { }
    friend void Y::bar(X& x);
};

void Y::bar(X& x)
{
    x.foo();
}

void Y::baz(X&)
{
    // the following would be an error
    // baz wasn't befriended with X
    // x.foo();
}

int main()
{
    X x;
    Y y;
    y.bar(x);
}

X宣言と定義の順序に注意してください。実際にinsideで何か便利なものを作成できるように、このようにする必要がありますY::bar()

ただし、これを実行することをお勧めします。落ちた場合、クラスの「一部」と友達になるだけでよい場合は、クラスがあまりにも多くの責任を負っている可能性があります。

于 2012-12-08T10:34:47.393 に答える
0

私はおそらく、ADLの概念を使用して中間プロキシのラインを探索するでしょう。もちろん、これは概念を示す部分的な実装です。

namespace XNProxy {
    class XNP;
}

namespace XN
{
    using XNProxy::XNP;

    class X {
        friend void f(X *);
    private:
        void foo() { };
    };

    void f(X* p) {
        X x;
        x.foo();
    }
}

namespace XNProxy 
{
    class XNP { };
    using XN::X;
    void f(XNP *) {
        f((XN::X *)nullptr);
    }
};

namespace YN
{
    class Y {
    public:
        void bar() { 
            XNProxy::XNP x;
            f((XNProxy::XNP*)nullptr);
        }
    };
}

int main() {
    YN::Y y;
    y.bar();
}
于 2012-12-08T10:44:53.433 に答える
0

いいえ、あなたがすることはできません。ただし、次のことができます。

class X_foo_friend;

class X
{
    void foo();
    friend class X_foo_friend;
};

class Y
{
    X x;
public:
    void bar();
};

class X_foo_friend
{
    static void foo(X& x);
    friend void Y::bar();
};

void X::foo() {};
void X_foo_friend::foo(X & x) { x.foo(); }

void Y::bar()
{
    X_foo_friend::foo(x);
}

IMO、これはかなりばかげています。つまり、あなたは X と Y の両方を設計しているので、X の機能の Y での使用を単純に制限できます。

于 2012-12-08T10:34:46.380 に答える