【问题标题】:A simple query regarding Qt and pointers关于 Qt 和指针的简单查询
【发布时间】:2017-05-12 10:59:05
【问题描述】:

这不是一个重大疑问,但自从我看到它以来,它一直困扰着我。 这样做:

QObject* f_pObject = this;

做同样的事情:

f_pObject = f_pObject->parent();

?

PS:我曾经很不擅长指针,现在我正在重新努力学习它。

PPS:我不讨厌。我认为对于专业程序员和正在学习的人来说,这是一个令人鼓舞的论坛。这不像是我要求完成我的家庭作业。

【问题讨论】:

  • 您所说的“与...做同样的事情”是什么意思?目前还不清楚你在问什么。用初始化声明一个变量(你的第一个代码行)与将一个表达式关联到一个变量不同(不管是什么表达式)。第二行取决于f_pObject 的现有值。
  • @DmitrySazonov 感谢您的回复。如果我的理解是错误的,请纠正我:第一行初始化一个指针“f_pObject”并将其分配给它在(“this”)中定义的父类的地址。第二行调用f_pObject指向的类中的parent()函数,返回父类的地址,再次放入f_pObject。那么他们不是在做同样的事情吗?
  • this 不是父类。是现在的班级。你的第二个说法是正确的。

标签: qt pointers


【解决方案1】:

让我们看一个完整的例子,与它产生的输出交错:

#include <QtCore>

class P : public QObject { Q_OBJECT };

class C : public QObject {
   Q_OBJECT
   QObject * pointer;
public:
   C(QObject * parent = {}) : QObject{parent} {
      pointer = this;
      qDebug() << "this" << this << "pointer" << pointer;
   }
   void test() {
      pointer = pointer->parent();
      qDebug() << "this->parent()" << this->parent() << "pointer" << pointer;
   }
};

int main() {
   P parent;
   C child{&parent};  // this C(0x7fff5e663ac8) pointer C(0x7fff5e663ac8)
   child.test();      // this->parent() P(0x7fff5e663ae0) pointer P(0x7fff5e663ae0)
   C orphan;          // this C(0x7fff5e663aa0) pointer C(0x7fff5e663aa0)
   orphan.test();     // this->parent() QObject(0x0) pointer QObject(0x0)
}
#include "main.moc"

pointer(或您的情况下的f_pObject)是一个指向对象的变量。它的价值与任何特定对象的存在完全脱钩。 pointer 不是对象!

这就像有一张纸的地址。 将指针想象成一张纸,上面有地址。最初,您将 C. Hild 女士的地址写在上面。然后你去拜访 C. Hild 女士,问她父母的地址。她把地址给了你,然后你用 P. Arent 先生和 P. Arent 女士的地址擦除并覆盖这张纸。

很明显,无论你对这张纸(指针)做什么,都与 C. Hild 女士和 P. Arent 先生和 P. Arent 女士的房子是否存在无关。

女士。 C. Hild 可能生来就是孤儿,或者如果她的父母死去(父对象被破坏),或者如果他们不承认她(父对象仍然存在,但孩子得到setParent(nullptr)),则成为孤儿。如果任何对象(“房屋”)不复存在,您最终会得到一个悬空指针。你有一张不知道地址的纸。

【讨论】:

  • 好的!因此,如果我理解正确,在第一行中,当前子类的地址存储在指针中。并且在第二行中,父类的地址替换了同一个指针变量中当前子类的地址。因此,如果没有父类,则指针将具有空值。对吗?
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多