以下是否安全?我知道,严格来说,在指向它的东西之前解除引用指针似乎很危险,但我想编译器只提供一个指针而不实际进行任何解除引用。好吧,我想。
(注意:gInst实际上直到很久才使用该引用。)
TU 1
Sys::System::System::System(const sf::VideoMode& rVM, const std::string& rSTR, unsigned long settings) :
win(rVM, rSTR, settings),
gInst(*this)
{
}
标题A
namespace Sys
{
namespace System
{
struct System;
}
namespace UI
{
struct GUI
{
System::System& topl;
MenuBar menu;
GUI(System::System&);
private:
GUI();
GUI(const GUI&);
GUI& operator=(const GUI&);
};
}
}
标题B
namespace Sys
{
namespace System
{
struct System
{
sf::RenderWindow win;
Sys::UI::GUI gInst;
Sys::Editor::Editor eInst;
System(const sf::VideoMode&, const std::string&, unsigned long);
private:
System();
System(const System&);
System& operator=(const System&);
};
void start();
}
}
答案 0 :(得分:5)
(注意:gInst实际上直到很久才使用该引用。)
然后它是完全安全的。 (注意你说“参考”,而不是“价值”。)
由于你所说的原因,编译器会对此发出警告,但没有任何未定义的内容,只是“冒险”。请注意,您可以经常使用以下内容来编辑编译器警告(如果他们打扰您):
struct foo
{
foo() : b(self())
{}
private:
foo& self() { return *this; }
bar b;
};
答案 1 :(得分:1)
简短的回答:也许,如果你小心的话。
答案很长:https://isocpp.org/wiki/faq/ctors#using-this-in-ctors
与您的具体问题有关:只要gInst真的是参考,那就没问题。
(命名空间系统中名为System的类,命名空间Sys?o.O)
答案 2 :(得分:1)
只要gInst从不访问gInst的数据成员或成员函数或尝试通过RTTI或dynamic_cast执行运行时类型内省,直到构造函数完成之后,它才是安全的。
答案 3 :(得分:0)
如何声明gInst?如果需要引用并将其存储为引用(Sys::System::System &
)/指针(Sys::System::System *
),则将其保险。如果它需要一个原始类(Sys::System::System
)或将其存储为原始类,它将不安全,因为它将复制它。