【问题标题】:Declaring an object as a member variable of itself [duplicate]将对象声明为自身的成员变量[重复]
【发布时间】:2016-06-24 15:59:10
【问题描述】:

我正在编写一个游戏引擎(使用 SFML 库),但我似乎无法让它工作。我正在编写代码的 GUI 部分,我想在自身内部声明一个相同类的对象(父/子,以便我可以将对象链接在一起)。除非类完成实例化,否则我不能这样做。是否有某种临时方法可以强制子变量和父变量以某种方式工作?

#ifndef ELEMENT_H
#define ELEMENT_H

#include <iostream>

class Element
{
    public:
        Element();
    private:
        int id, position_x, position_y, pixel_x, pixel_y, width, height;

        Element parent;
        std::vector<Element> child;
};

#endif // ELEMENT_H

我得到的错误:

include\Element.h|13|error: field 'parent' has incomplete type 'Element'|

【问题讨论】:

  • 如果你能做到,Element 将拥有无限大小。
  • 哦,好点子.. 如果我将它们设为未声明的指针会怎样?
  • 实现文件是否存在?如果没有,您可以将 parent 更改为引用:Element&amp; parent 并在构造函数初始化列表中对其进行初始化。

标签: c++ recurrence class-members


【解决方案1】:

您不能像在其中那样在其自身中声明 Class &lt;x&gt; 类型的集合变量。

但是,您可以拥有一个包含数据成员的类,该数据成员是指向自身的指针...

#ifndef ELEMENT_H
#define ELEMENT_H

#include <iostream>

class Element
{
    public:
        Element();
    private:
        int id, position_x, position_y, pixel_x, pixel_y, width, height;

        Element *parent;
        std::vector<Element *> child;
};

#endif // ELEMENT_H

【讨论】:

  • omfg!!是的!这就是我在深夜编程时发生的事情 xD tyvm
  • 哈哈哈乐于助人! @荣誉
【解决方案2】:

您可以将parent 设为Element* 类型(如果您想使用c++11/boost 的智能指针功能,则可以使用std::shared_ptr&lt;Element&gt;

你能想象一个 Element 里面有一个 Element 里面有一个 Element 的问题吗?它永远不会结束。通常,像这样的链有一个元素,即root,其中parent = NULL

【讨论】:

  • omfg 非常感谢哈哈!我昨晚没想到x.x
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多