C ++无法让Pointers工作

时间:2013-01-13 16:23:25

标签: c++ pointers

我在使用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没有指向它,而调试器则表示错误的指针。

谢谢。

1 个答案:

答案 0 :(得分:8)

一个问题,代码

LectureNode(Lecture lec)
{
    LecturePtr = &lec;
}

存储指向by-value参数的指针,local。如果稍后使用该指针,那么您有未定义的行为,因为by-value参数不再存在。


一个合理的解决方案是

LectureNode(Lecture* const lec)
    : lecturePtr_( lec )
{}

,其中

  • 传递一个指针,当指针要存储时是常规的(并且还解决了UB问题)

  • 使用初始化列表而不是在构造函数体中赋值,这是一个好习惯(它更通用,在更多情况下工作,也可以更高效)

  • 使用统一的命名约定(leclecturePtr_的小写初始字符),使用数据成员的通用后缀约定(结尾的下划线)。


只是传递中的一个注释,术语“初始化列表”具有多个含义。它还引用了一个花括号的初始值列表。构造函数初始化程序列表的神圣标准术语是 mem-initializer ,但我从未听过或看到有人使用该术语。