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_prev
和 m_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
你好,我想要一个链式对象结构,在 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_prev
和 m_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