0

我在 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 没有指向它,而是调试器说错误的指针。

谢谢你。

4

1 回答 1

8

一个问题,代码

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

存储指向按值参数的指针,一个本地的。如果稍后使用该指针,那么您将具有未定义的行为,因为按值参数不再存在。


一种合理的解决方案是

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

在哪里

  • 传递一个指针,这是存储指针时的常规做法(也解决了 UB 问题)

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

  • 使用统一的命名约定(lec和的首字母小写lecturePtr_),数据成员使用通用的后缀约定(下划线结尾)。


顺便提一下,“初始化列表”一词有多个含义。它还指的是初始值的花括号列表。构造函数初始化列表的神圣标准术语是mem-initializer,但我从未听说或见过有人使用该术语。

于 2013-01-13T16:25:16.783 回答