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 << " ";
}