cpp 具有 属性 相同类型的相同 class

cpp having a property with the same type of the same class

你好,我想要一个链式对象结构,在 class 中,我有 2 个 class 类型的属性与 class 内部的 class 相同我正在努力。喜欢:

class Base;


class Base
{
    private:
       Base * m_prev;
       Base * m_next;

    public:
      Base (Base prev, Base next) {
        m_prev = prev;
        m_next = next;
      }
      void set_prev(Base *prev) ....
      void set_next(Base *next) ....
...
}

De 编译器告诉我,当我尝试上面的操作时,我使用了一个未完成的类型,不知何故我明白了,但应该有办法解决它。

我曾经是一名使用不同语言(delpi/pascal/java/javascript 等)的程序员,每种语言都不一样,现在我正在尝试学习 C++,但我发现很难找到可以提供帮助的正确文档我出去了。

我很确定有一个通用的解决方案,但我找不到 google 的正确问题。

有人可以解决这个问题吗,

编辑:创建此 post 时我忘记添加 2 setter 行(现在已添加到此请求中)并在我匆忙时提出了后续问题。

你的构造函数应该是

Base (Base *prev, Base *next): m_prev(prev), m_next(next) {}

m_prevm_next 是指针。您不需要前向声明。这是一个工作示例:

class Base {
    private:
       Base *m_prev;
       Base *m_next;

    public:
      Base (Base *prev, Base *next): m_prev(prev), m_next(next) {}      
      void set_prev(Base *prev) { m_prev = prev; }
      void set_next(Base *next) { m_next = next; }

};

int main() {
    Base a(nullptr, nullptr); // a
    Base b(&a, nullptr); // a <- b
    a.set_next(&b); // a <-> b
    Base c(&a, &b); // a <-> b, a <- c -> b
    a.set_next(&c); // a <- b, a <-> c -> b
    b.set_prev(&c); // a <-> c <-> b
}

当然,也可以添加一些逻辑来避免手动重新链接:

class Base {
    private:
       Base *m_prev;
       Base *m_next;

    public:
      Base (Base *prev, Base *next) {
          set_prev(prev);
          set_next(next);
      }      
      void set_prev(Base *prev) {
          m_prev = prev;
          if (m_prev) {
              m_prev->m_next = this;
          }
      }
      void set_next(Base *next) {
          m_next = next;
          if (m_next) {
              m_next->m_prev = this;
          }
      }

};

int main() {
    Base a(nullptr, nullptr); // a
    Base b(&a, nullptr); // a <-> b
    Base c(&a, &b); // a <-> c <-> b
}

第二个代码中还有一些情况需要处理

    Base a(nullptr, nullptr); // a
    Base b(&a, nullptr); // a <-> b
    Base c(&a, &b); // a <-> c <-> b
    Base d(&a, &b); // a <-> d <-> b, a <- c -> b