【问题标题】:How to check object is valid如何检查对象是否有效
【发布时间】:2018-04-25 13:32:45
【问题描述】:

我有我的类对象,如果我在不同的地方有这个对象,当我删除并将这个对象初始化为 NULL 时,我希望这个对象在所有其他地方都是 NULL。有可能吗?

#include "mainwindow.h"
#include <QApplication>
#include "QDebug"

class A {
public:
    int x;
    int y;
};

class B : public A {
public:
    B(int a, int b) {
        this->m = a;
        this->n = b;
    }

    int m;
    int n;
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

B* temp = new B(1, 2);
B* b1 = temp;
B* b2 = temp;

delete temp;
temp = NULL;

qDebug() << b1->x << b2->x; //its print 421312312 -2131231231

return a.exec();
}

【问题讨论】:

  • 您需要的是智能指针。特别是共享和弱指针
  • 如果你打算使用基于 Qt 的类,你需要的是 QPointer
  • @DmitrySazonov 基于 QtObject 的类,否则正确。
  • @DmitrySazonov 不,我没有基于 Qt 的课程。我只有我的自定义类。
  • 顺便说一句,您不需要 this-&gt; 语法。直接赋值变量。

标签: c++ qt pointers


【解决方案1】:

使用标准,它会是这样的:

auto temp = std::make_shared<B>(1, 2);
std::weak_ptr<B> w1 = temp;
std::weak_ptr<B> w2 = temp;

temp.reset();


auto b1 = w1.lock();
auto b2 = w2.lock();
if (b1 && b2) {
    qDebug() << b1->x << b2->x;
}

【讨论】:

  • 和有什么区别?
  • 类似于QSharedPointerQWeakPointer,但在标准中。
【解决方案2】:

感谢@NathanOliver 和所有人。

我正在使用 QSharedPointer。

    QSharedPointer<B> obj = QSharedPointer<B>(new B(1, 2));

    obj.clear();

    B* t = obj.data();

    if (t)
        qDebug() << t->m << t->n;
    else {
        qDebug() << "NULL";
    }

现在 t 为 NULL。谢谢!

【讨论】:

  • 1) 使用 C++ 智能指针而不是 Qt 是否更好。你不需要 if-else 那里,因为你的 obj 将永远是 nullptr 那里。
  • 那行不通。一个指针必须是拥有的,另一个必须是弱指针,并且您需要在使用前锁定弱指针。你还没有真正尝试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2010-12-20
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多