星系统数据结构在Qt
Star system data structure implementation in Qt
我正在尝试实现一个有用的数据结构来建模恒星系统。有人告诉我,树结构可能是最好的,但std和Qt都没有现成的。
到目前为止,我一直在使用类似于以下的东西来模拟带有轨道飞行器的天体:
typedef struct Body {
/* various data*/
QList<Body> orbiters;
} Body;
这很有用,因为它可以让我快速了解特定物体的轨道。然而,它不允许我确定,仅仅是有问题的物体,物体在绕什么轨道运行!有可能在上面添加某种"父指针"来实现这一点吗?
这里有一个简单的树实现,基于Qt对象模型(所有QObject都有能力形成树)
class Body {
public:
// When a Body is constructed, it automatically remembers its parent
// and adds itself to its parent's list of children.
Body(const QString& name, Body* parent = nullptr) {
this->m_name = name;
this->m_parent = parent;
if (parent != nullptr) {
parent->m_orbiters.append(this);
}
}
// When a parent is deleted, the children are automatically deleted too.
// If you use shared pointers, you don't need this destructor.
~Body() {
qDeleteAll(m_orbiters);
}
// Getters
QString name() const { return m_name; }
Body* parent() const { return m_parent; }
QList<Body*> children() const { return m_orbiters; }
private:
QString m_name;
Body* m_parent;
QList<Body*> m_orbiters;
};
构建树:
// The sun doesn't orbit anything
Body* sun = new Body("Sun");
// The planets orbit the sun
Body* mercury = new Body("Mercury", sun);
Body* earth = new Body("Earth", sun);
Body* mars = new Body("Mars", sun);
// The moons orbit the planets
Body* moon = new Body("Moon", earth);
Body* phobos = new Body("Phobos", mars);
Body* deimos = new Body("Deimos", mars);
打印直接绕太阳运行的天体列表:
auto planets = sun->children();
for (Body* planet : planets) {
qDebug() << planet->name();
}
// Output:
// "Mercury"
// "Earth"
// "Mars"
删除树:
// The sun's destructor deletes the planets;
// the planets' destructor deletes the moons
delete sun;
顺便说一句,听起来你对数据结构和指针没有太多经验。我建议你读一本关于这两个主题的好教程/书——你的C++生活会因此变得容易得多。
QObject基于层次结构:从该链接引用
QObjects在对象树中组织自己。当您创建一个以另一个对象为父对象的QObject时,该对象将自动将自己添加到父对象的children()列表中。父对象拥有对象的所有权;即它将自动删除其析构函数中的子项。您可以按名称查找对象,也可以选择使用findChild()或findChildren()键入。
然后我建议更改您的类,从QObject:继承
class Body : public QObject {
Q_OBJECT
public:
Body(QString name, QObject *parent = 0) : QObject(parent) {
setObjectName(name);
}
/* keep orbiters in children(), find them by name */
/* parent() give you the relation you're missing now... */
...
};
更改后,您将获得良好的对象系统的所有好处,以及通过信号/插槽进行高级通信等好处。
相关文章:
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- Qt:通过深度复制访问列表中的数据结构是否应该比通过指针访问它慢得多
- QT:使用QVariant任意复杂的数据结构
- 是否有QT C 数据容器可用于动态大小结构
- QT编辑自定义数据结构
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 在 C++/Qt 中以文本格式序列化数据结构
- Qt内置数据结构中是否有忽略重复插入项目的数据结构
- Qt数据报结构结果:混合序列
- 使用foreach循环修改Qt数据结构的正确方法
- 在数据结构Qt中存储目录层次结构
- 如何将Qt信号/槽名存储到数据结构中
- 星系统数据结构在Qt