我的代码:
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的成员。这会导致任何问题吗?
答案 0 :(得分:8)
是的,可以提供对this
的引用。但是,当其他对象稍后将使用指针时,您通常希望这样做。您的用例看起来会在构造函数完成之前立即使用Scene
,这是一个非常滑的斜率。
现在,你在调用parse
后没有建立任何不变量,所以它应该没问题,但是它也很脆弱,以后容易引起破坏。
答案 1 :(得分:4)
在您的特定示例中,不会出现任何问题。
通常,发出this
引用的问题是两个对象的生命周期并不完全对齐,而另一个对象可能会在被销毁之后尝试访问引用对象。
在您的示例中,scene_parser
对象位于堆栈中,因此它的生命周期在Scene
构造函数的末尾结束。没有可能通过您提供的this
引用尝试访问不存在的对象,因此不会出现任何问题。
答案 2 :(得分:1)
取决于。
在构造函数体内(即,一旦执行初始化程序列表),该对象被视为“完全构造”直到当前类型。因此,您可以引用*this
,但任何virtual
函数调用都不会在派生类中使用覆盖函数。
答案 3 :(得分:0)
所有子对象(成员和基础)都是由构造函数体中的第一个语句构造的。如果您的对象此时处于“有效状态”(这是您的类的定义的一部分,有时称为“类不变”),您可以将其视为完全构造的对象并对其执行任何操作。但是,虚拟查找的工作方式与您预期或要求的方式略有不同:如果这是一个基类(因此该对象是其他东西的子对象),则最终类型尚未“分配”。例如,这是调用纯虚方法并获得运行时错误的一种方法(如果这些方法没有定义,无论如何)。
更有趣的情况是在构造函数初始化程序中使用 this ;确实有一些警告,但这也是在构造函数体之前。