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

Bwm*_*mat 6 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 8

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

现在,你在调用之后没有建立任何不变量parse,所以它应该没问题,但是它也很脆弱,并且很容易在将来的更改中引入破坏.

  • @voodooclock:与虚函数相关的警告实际上并不需要将`this`指针交给任何其他对象.从构造函数内部调用类自己的函数可能会遇到麻烦.此外,OP已经指出`Scene`是一个终端类,因此对象的动态类型不会成为问题. (2认同)

Dre*_*all 4

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

一般来说,给出引用的问题this是两个对象的生命周期并不完全一致,另一个对象可能会在被引用的对象被销毁后尝试访问该对象。

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

  • 不,但是如果 `parser` 调用 `virtual` 函数,您将无法获得所需的效果。尽管这*是*合法的,但您可以(并且可能应该)认为这是一个错误。 (3认同)