是'给出'在构造函数中对'this'的引用ok?

时间:2010-11-10 04:49:44

标签: c++

我的代码:

Scene::Scene(const std::string &scene_file) : ambient_light(0, 0, 0), background(0, 0, 0){
  scene_parser parser(*this);
  parser.parse(scene_file);
}

scene_parser是Scene的朋友,在parse方法中它访问(r / w)Scene的成员。这会导致任何问题吗?

4 个答案:

答案 0 :(得分:8)

是的,可以提供对this的引用。但是,当其他对象稍后将使用指针时,您通常希望这样做。您的用例看起来会在构造函数完成之前立即使用Scene,这是一个非常滑的斜率。

现在,你在调用parse后没有建立任何不变量,所以它应该没问题,但是它也很脆弱,以后容易引起破坏。

答案 1 :(得分:4)

在您的特定示例中,不会出现任何问题。

通常,发出this引用的问题是两个对象的生命周期并不完全对齐,而另一个对象可能会在被销毁之后尝试访问引用对象。

在您的示例中,scene_parser对象位于堆栈中,因此它的生命周期在Scene构造函数的末尾结束。没有可能通过您提供的this引用尝试访问不存在的对象,因此不会出现任何问题。

答案 2 :(得分:1)

取决于。

在构造函数体内(即,一旦执行初始化程序列表),该对象被视为“完全构造”直到当前类型。因此,您可以引用*this,但任何virtual函数调用都不会在派生类中使用覆盖函数。

答案 3 :(得分:0)

所有子对象(成员和基础)都是由构造函数体中的第一个语句构造的。如果您的对象此时处于“有效状态”(这是您的类的定义的一部分,有时称为“类不变”),您可以将其视为完全构造的对象并对其执行任何操作。但是,虚拟查找的工作方式与您预期或要求的方式略有不同:如果这是一个基类(因此该对象是其他东西的子对象),则最终类型尚未“分配”。例如,这是调用纯虚方法并获得运行时错误的一种方法(如果这些方法没有定义,无论如何)。

更有趣的情况是在构造函数初始化程序中使用 this ;确实有一些警告,但这也是在构造函数体之前。