繁体   English   中英

前向声明类时成员函数的行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM