[英]Behaviour of member functions when forward declaring classes
当下面的代码用C ++ 11编译时,它的行为符合预期。
class Student;
class University
{
vector <Student*> students;
public:
University();
void print();
};
class Student
{
string name;
public:
Student(string nom) : name(nom) {}
friend ostream& operator << (ostream& out, Student* S)
{
return out << S -> name;
}
};
University::University()
{
for (string name: {"Alice", "Bob"})
students.push_back(new Student(name));
}
void University::print() { for (auto s: students) cout << s << '\n'; }
int main()
{
University uni;
uni.print();
}
打印输出是
Alice
Bob
但是,当在类声明中实现print()函数时,如下所示:
class University
{
vector <Student*> students;
public:
University();
void print() { for (auto s: students) cout << s << '\n'; }
};
打印输出变为
0x20055ff0
0x20056028
问题 :即使在第一行中已经声明了Student
为什么print()
函数的行为仍然如此?
解决方案 :在实现任何成员函数之前,请声明所有类。 只要print()
和operator <<
都在类声明之后实现, print()
就可以正常工作,即使在operator <<
之前实现
使用operator<<
打印指针的默认行为是打印所指向的内存地址的十六进制表示。
当print()
的实现位于类声明内时,编译器尚未看到对Student*
指针的operator<<
重写,因此它不知道它的行为与默认行为有所不同。
当您在operator<<
覆盖之后定义print()
实现时,编译器知道使用该覆盖而不是默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.