c++ - 崩溃,施工前使用它

标签 c++

我有一个类,它的对象将被另一个类使用,如下所示

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/

相关文章:

如果在 .cpp 中实现函数,则出现 C++ 链接错误

c++ - std::regex_constants::optimize 使用的优化技术

c++ - 为已知的更常见路径优化分支

Android 在 OSX 10.8.5 上构建错误 : cp: the -R and -r options may not be specified together

c++ - 如何在发送 EM_SETCUEBANNER 消息时更改文本提示的颜色?

c++ - 如何基于元组元素进行递归?

c++ - 在类的外部定义时,模板 C++ 类中的 typedef 不起作用?

c++ - QVTKOpenGLWidget 和 vtkGenericOpenGlRenderWindow 与 QTDesigner

c++ - 是否符合 C++ 以及如何从信号中删除小部件

c++ - QPrintDialog 在窗口中显示两次