我在使用C ++中的指针时遇到问题,我无法弄清楚它是什么;
我有一个名为LectureNode的课程:
class LectureNode
{
public:
Lecture *LecturePtr;
LectureNode(Lecture lec)
{
LecturePtr = &lec;
}
};
这个类的构造函数工作得很好。 我有另一堂课:
class LectureForest
{
LectureNode *LecNode;
list<Lecture>::iterator it;
public:
LectureForest(list<Lecture> lecs)
{
Makeset(lecs);
}
void Makeset(list<Lecture> lecs)
{
for(it = lecs.begin(); it != lecs.end(); it++)
{
LecNode = LectureNode(*it);
}
}
问题发生在最后一行。 (* it)传递给LectureNode构造函数,LectureNode成功创建,但是LecNode没有指向它,而调试器则表示错误的指针。
谢谢。
答案 0 :(得分:8)
一个问题,代码
LectureNode(Lecture lec)
{
LecturePtr = &lec;
}
存储指向by-value参数的指针,local。如果稍后使用该指针,那么您有未定义的行为,因为by-value参数不再存在。
一个合理的解决方案是
LectureNode(Lecture* const lec)
: lecturePtr_( lec )
{}
,其中
传递一个指针,当指针要存储时是常规的(并且还解决了UB问题)
使用初始化列表而不是在构造函数体中赋值,这是一个好习惯(它更通用,在更多情况下工作,也可以更高效)
使用统一的命名约定(lec
和lecturePtr_
的小写初始字符),使用数据成员的通用后缀约定(结尾的下划线)。
只是传递中的一个注释,术语“初始化列表”具有多个含义。它还引用了一个花括号的初始值列表。构造函数初始化程序列表的神圣标准术语是 mem-initializer ,但我从未听过或看到有人使用该术语。