我在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;
}
答案 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指针。