【问题标题】:cpp having a property with the same type of the same classcpp 具有同一类的相同类型的属性
【发布时间】:2021-07-24 11:17:08
【问题描述】:

您好,我想要一个链式对象结构,在该类中,我有 2 个与我正在处理的类中的类相同的类类型的属性。喜欢:

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) ....
...
}

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

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

我很确定有一个通用的解决方案,但我无法找到谷歌的正确问题。

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

编辑:在创建此帖子时,我忘记添加 2 行设置器(现在已添加到此请求中),并在我赶时间时提出了后续问题。

【问题讨论】:

  • 我认为编译问题可能出在省略号中省略的代码中。有抽象方法吗? (顺便说一句属性 => 类成员)
  • 我认为我的主要问题是 id 不允许正确设置 m_prev 和 m_next,我只是收到有关未完成类型或类似内容的错误消息。我认为这将通过波纹管的答案来解决,我将很快进行测试。

标签: c++ class oop properties


【解决方案1】:

你的构造函数应该是

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

【讨论】:

  • 非常感谢@Jabaa 回答了我的两个问题,后续的内容是我一开始忘记添加并且没有看到编辑按钮的内容。答案很清楚
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多