Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将一个方法声明为";朋友;?_C++ - Fatal编程技术网

C++ 如何将一个方法声明为";朋友;?

C++ 如何将一个方法声明为";朋友;?,c++,C++,基本上,我在一个namspace下有两个类,我想让一个类的方法之一(称之为B::fun)访问另一个类的私有成员(称之为class a)。然而,我似乎无法让它发挥作用。下面是一个简单的示例,说明了问题: namespace ABC // this could be global too { class A; class B { public: int fun(A member); }; class A { publ

基本上,我在一个namspace下有两个类,我想让一个类的方法之一(称之为
B::fun
)访问另一个类的私有成员(称之为
class a
)。然而,我似乎无法让它发挥作用。下面是一个简单的示例,说明了问题:

namespace ABC // this could be global too
{
    class A;

    class B
    {
    public:
        int fun(A member);
    };

    class A
    {
    public:
        friend int B::fun(A member);

    private:
        int aint;
    };

    int B::fun(A member)
    {
        return member.aint; // error: member ABC::A::aint is inaccessible
    }
}
为什么会出现这个错误


注意:似乎是编译器的问题(使用VC++11)。实际上,对于G++4.8.1和CLang++3.3,我在
friend
行中遇到了一个错误:

g++
错误:“int ABC::B::fun(ABC::A)”是私有的

clang++
错误:好友函数“fun”是“ABC::B”的私人成员。

也就是说,错误在于,
ABC::B::fun()
是私有的,因此友元声明失败,然后您发出信号的行失败

发生这种情况的原因很简单,就是你无法交到一个你无法接触的朋友

解决的办法是把
ABC::B::fun()
公之于众,或者把整个
B
交为朋友,或者做类似的事情

顺便说一下,名称空间与您的错误无关,但是如果您的好友声明只是:

friend int B::fun(A member);

由于您已经在命名空间
ABC
中,实际上,在G++4.8.1和CLang++3.3中,我在
friend
行中遇到了一个错误:

g++
错误:“int ABC::B::fun(ABC::A)”是私有的

clang++
错误:好友函数“fun”是“ABC::B”的私人成员。

也就是说,错误在于,
ABC::B::fun()
是私有的,因此友元声明失败,然后您发出信号的行失败

发生这种情况的原因很简单,就是你无法交到一个你无法接触的朋友

解决的办法是把
ABC::B::fun()
公之于众,或者把整个
B
交为朋友,或者做类似的事情

顺便说一下,名称空间与您的错误无关,但是如果您的好友声明只是:

friend int B::fun(A member);

由于您已经在命名空间
ABC
中,请在
A
中更改您的好友声明

class A {
    friend class B;
    int aint;
};
或者,为了只与单一方法交朋友,您需要将
A
交为
B
的朋友,因为您的
friend
方法是私有的。或者你可以把
的乐趣(A)
公之于众

namespace ABC
{
    class A;

    class B
    {
        friend class A;
        int fun(A member);
    };

    class A
    {
        friend int B::fun(A);
        int aint;
    };

    int B::fun(A member)
    {
        return member.aint;
    }
}

A中更改您的好友声明

class A {
    friend class B;
    int aint;
};
或者,为了只与单一方法交朋友,您需要将
A
交为
B
的朋友,因为您的
friend
方法是私有的。或者你可以把
的乐趣(A)
公之于众

namespace ABC
{
    class A;

    class B
    {
        friend class A;
        int fun(A member);
    };

    class A
    {
        friend int B::fun(A);
        int aint;
    };

    int B::fun(A member)
    {
        return member.aint;
    }
}


这是私人的这就是为什么它告诉你它的inaccessible@aaronman请注意,我试图将该方法声明为
a
friend
。它是私有的,这就是为什么它会告诉您它的inaccessible@aaronman请注意,我试图将该方法声明为
a
朋友(好的,我已经公开了好友声明并删除了显式的名称空间,但是我仍然得到了错误(请参阅OP中的调整版本).有什么想法吗?@aaronman:我知道,但是如果
A
声明
B
为好友,那么
B
的任何成员函数都可以访问
A::aint
,即使它是私有的。@ausairman:不,不,你什么都没有更改。好友声明是在类的公共部分还是私有部分都没有关系。问题出在哪里是不是
intfun(A)
在类
B
中是私有的。我的建议是将
public:
添加到类
B
@ausairman:这可能是一个编译器错误。我在中测试过,它确实编译过。友谊不是相互的:(好的,我已经公开了好友声明并删除了显式的名称空间,但是我仍然得到了错误(请参阅OP中的调整版本).有什么想法吗?@aaronman:我知道,但是如果
A
声明
B
为好友,那么
B
的任何成员函数都可以访问
A::aint
,即使它是私有的。@ausairman:不,不,你什么都没有更改。好友声明是在类的公共部分还是私有部分都没有关系。问题出在哪里是不是
intfun(A)
在类
B
中是私有的。我的建议是将
public:
添加到类
B
@ausairman:这可能是一个编译器错误。我在中测试过,它确实编译过。@ausairman那么你需要让类
A
成为
B
的朋友,因为
fun(A)
是私有的。我将编辑我的答案以包含它。我已经尝试将
A::fun
公开,但我仍然收到错误…仍然为我提供相同的错误…显然这是一个VC++问题…感谢您的帮助,尽管我会与Microsoft联系。@ausairman然后您需要将class
A
作为朋友因为
fun(A)
是私有的。我将编辑我的答案以包含这一点。我已经尝试将
A::fun
公开,但我仍然得到了错误…仍然给我同样的错误…显然这是一个VC++问题…谢谢你的帮助,尽管我将与Microsoft合作。