C ++重载<<操作员问题

时间:2009-10-14 07:44:09

标签: c++ pointers operator-overloading

我在C ++上相当苛刻,但对指针,解除引用等非常熟悉。我的<<<<<<<<<<<<<<<类的运算符,因为它运行时编译正常但崩溃。感觉就像一个无限循环,但我不确定。这是代码,感谢任何帮助。

#include <string>
#include <iostream>

using namespace std;

class Person
{

private:

 string _name;
 Person* _manager;

public:

 Person(string name, Person *manager);
 Person(string name);

 friend ostream &operator<<(ostream &stream, Person &p);

};


Person::Person(string name, Person *manager)
{
 _name = name;
 _manager = manager;
}

Person::Person(string name)
{
 _name = name;
}

ostream &operator<<(ostream &stream, Person &p)
{
 Person* mgr = p._manager;

 stream << p._name << std::endl;
 stream << mgr->_name << std::endl;
 return stream;
}


int main()
{
 Person *pEmployee = new Person("John Doe Employee");
 Person *pManager = new Person("John Doe Manager", pEmployee);

 cout << *pEmployee;
 cout << *pManager;

 return 0;
}

5 个答案:

答案 0 :(得分:4)

在只有一个参数的构造函数中,需要将_manager设置为NULL / 0。在您的运营商中对此进行测试&lt;&lt;如果为NULL / 0,则不输出mgr-&gt; name。就目前而言,您正在取消引用未初始化的指针。

Person::Person(string name)
{
    _name = name;
    _manager = 0;
}

ostream &operator<<(ostream &stream, Person &p)
{
    Person* mgr = p._manager;

    stream << p._name << std::endl;
    if (mgr)
        stream << mgr->_name << std::endl;
    return stream;
}

还有许多其他方法可以做得更好,比如在参数上使用const引用并使用构造函数初始化列表,但它们不会成为问题的原因。您还应该使用传递给构造函数的manager对象解决所有权问题,以确保它不会被双重删除。

答案 1 :(得分:2)

您的_manager指针在构造第一个Person实例时未初始化,因此在您的运算符中引用p._manager&lt;&lt;崩溃。 除此之外,你有一个内存泄漏,因为你调用new但不删除。

答案 2 :(得分:2)

operator<<的实施不会检查_manager成员是否有效。如果没有经理,您应该通过将指针设置为0来明确这一点。否则指针值未定义,访问它将导致程序崩溃。

(1)如果构造函数中没有提供Person类,则_manager类应将0设置为Person::Person(string name) : _name(name), _manager(0) { } (空指针):

operator<<

(2)在if (mgr) { stream << mgr->_name << std::endl; } 中,在解除引用之前检查指针:

const string&

更好代码的一些提示:

(1)将您的函数参数更改为接受string而不是operator<<。这样,在调用函数/构造函数时不会复制字符串,而是作为常量引用传递。

(2)让const同时接受Person的{​​{1}}引用更为清晰,因为它不会/不应该修改Person。这样,您也可以在具有常量Person的位置使用运算符。

答案 3 :(得分:0)

Person::Person(string name)
{
    _name = name;
}

谁是你的经理?

Person::Person(string name) : _manager(NULL)
{
    _name = name;
}

ostream &operator<<(ostream &stream, Person &p)
{
 Person* mgr = p._manager;

 stream << p._name << std::endl;
 if (mgr != NULL) { stream << mgr->_name << std::endl; }
 return stream;
}

答案 4 :(得分:-1)

您的Person实例* pEmployee没有设置_manager。这可能是一个NULL指针。