我有一个类,它的对象将被另一个类使用,如下所示
class A
{
public:
void F() {...}
};
class B
{
public:
void G() { m_a->F(); ...} // use A's function
private:
A* m_a;
};
因此在指针m_a赋值之前调用B::G()是错误的。这是可以接受的设计吗?或者有更好的方法。
问题来自开发 GUI 应用程序。我在主窗口下面有一个窗口,用来显示当前操作的一些基本信息,比如发生了什么,需要多长时间等等。我把这个窗口作为一个单例,以便于可能分散在任何地方的操作访问,并发现关闭 GUI 应用程序时代码崩溃。崩溃是由于GUI应用程序(如Qt中的qApp)删除后窗口被删除。然后我只是将窗口的引用指针放在单例中。当构建窗口时,我设置了引用指针。窗口的删除由主窗口控制。这样就解决了上面提到的崩溃问题。但是如果其他开发人员在构建窗口之前使用单例,代码也会崩溃。有什么好的方法解决吗?或者我们可以接受它,因为开发人员在构建之前使用它是错误的?非常感谢!
最佳答案
如果 m_a
未初始化,调用函数 G()
可能会导致未定义的行为,因此您要确保永远不会出现这种情况。您必须更改代码以使其看起来像这样:
class B
{
public:
B() : m_a(nullptr) { } // m_a always initialized!
bool G()
{
if (m_a == nullptr) return false; // No Undefined Behavior!
m_a->F(); // This call is safe now
...
return true;
}
private:
A* m_a;
};
顺便说一句,除非您有充分的理由这样做,否则通常您应该使用智能指针(选择实现适当所有权语义的类型)而不是原始指针。这甚至可以让您免于手动初始化(假设共享所有权):
#include <memory>
class B
{
public:
bool G()
{
if (m_a == nullptr) return false; // No Undefined Behavior!
m_a->F(); // This call is safe now
...
return true;
}
private:
std::shared_ptr<A> m_a; // Automatically initalized to nullptr
};
关于c++ - 崩溃,施工前使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629600/