Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++_Class_C++11_Inner Classes - Fatal编程技术网

C++ 将私有嵌套(内部)类的非成员函数定义放在何处?

C++ 将私有嵌套(内部)类的非成员函数定义放在何处?,c++,class,c++11,inner-classes,C++,Class,C++11,Inner Classes,下面是我实际问题的一个简单例子。我有一个使用 InnerClass中的friend关键字。此函数的定义应在InnerClass之外 另一方面,类定义位于MyClass的private下,因为我想专门为MyClass使用InnerClass 在本例中,我可以将friend函数的定义放在哪里? #include <iostream> class MyClass { private: class InnerClass { int m_int; pu

下面是我实际问题的一个简单例子。我有一个使用
InnerClass
中的
friend
关键字。此函数的定义应在
InnerClass
之外

另一方面,类定义位于
MyClass
private
下,因为我想专门为
MyClass
使用
InnerClass

在本例中,我可以将
friend
函数的定义放在哪里?

#include <iostream>

class MyClass
{
private:
    class InnerClass
    {
        int m_int;
    public:
        InnerClass(int i) :m_int(i) {}

        // non-member (friend) function, for which I need a definition outside the class!
        friend std::ostream& operator<<(std::ostream& output, const InnerClass &obj);
    };
    // ERROR: too many parameter for this operator
    std::ostream& operator<<(std::ostream& output, const InnerClass &obj)
    {
        return output << obj.m_int << " ";
    }

private:
    InnerClass m_innerClass;

public:
    explicit MyClass(int i) : m_innerClass{ i } {}
    friend std::ostream& operator<<(std::ostream& output, const MyClass &obj);
};

std::ostream& operator<<(std::ostream& output, const MyClass &obj)
{
    output << obj.m_innerClass << std::endl;
}


int main()
{
    MyClass classObj{ 2 };
    std::cout << classObj;
    return 0;
}
#包括
类MyClass
{
私人:
类内部类
{
int m_int;
公众:
内部类(inti):m_int(i){}
//非成员(朋友)函数,我需要一个类外的定义!

friend std::ostream&operator您实际上可以在类定义中定义friend非成员函数

以下是已修复的代码片段:

#include <iostream>

class MyClass
{
private:
    class InnerClass
    {
        int m_int;
    public:
        InnerClass(int i) :m_int(i) {}

        // non-member (friend) function, which we can define right here
        friend std::ostream& operator<<(std::ostream& output, const InnerClass &obj)
        {
            return output << obj.m_int << " ";
        }
    };    

private:
    InnerClass m_innerClass;

public:
    explicit MyClass(int i) : m_innerClass{ i } {}
    friend std::ostream& operator<<(std::ostream& output, const MyClass &obj);
};

std::ostream& operator<<(std::ostream& output, const MyClass &obj)
{
   return output << obj.m_innerClass << std::endl;
}


int main()
{
    MyClass classObj{ 2 };
    std::cout << classObj;
    return 0;
}

请注意,您声明为
friend
的是一个自由函数,您定义的是一个成员函数,答案显示了如何在class@user463035818在上述情况下,这是唯一的方法吗?总是有不止一种方法,不知道你的意思…我的疑问是:为什么
运算符…因为您没有提供该运算符的定义,所以您提供的是
MyClass
的一个成员函数,它有点类似于您想要的运算符,但它不是相同的,在上述情况下,这是唯一的方法吗?为什么
operator@Const编译器确实找到了定义,但正如我所说如上所述,您定义的方法与您声明为的方法不同friend@user463035818嗯,好的。@ const,是的,那个用户说的。考虑一下,原来代码中的错误是因为成员运算符只能有1个参数。如果你让代码< InnerClass > <代码>可访问,你仍然可以定义外部函数:
#include <iostream>

class MyClass
{
private:
    class InnerClass
    {
        int m_int;
    public:
        InnerClass(int i) :m_int(i) {}

        // non-member (friend) function, which we can define right here
        friend std::ostream& operator<<(std::ostream& output, const InnerClass &obj)
        {
            return output << obj.m_int << " ";
        }
    };    

private:
    InnerClass m_innerClass;

public:
    explicit MyClass(int i) : m_innerClass{ i } {}
    friend std::ostream& operator<<(std::ostream& output, const MyClass &obj);
};

std::ostream& operator<<(std::ostream& output, const MyClass &obj)
{
   return output << obj.m_innerClass << std::endl;
}


int main()
{
    MyClass classObj{ 2 };
    std::cout << classObj;
    return 0;
}
std::ostream& operator<<(std::ostream& output, const MyClass::InnerClass &obj)
{                                                //  ^^^^^^^^^^^^^^^^^^^ 
    return output << obj.m_int << " ";
}