如何在类中定义类的对象?

时间:2014-08-15 22:29:12

标签: c++

我正在尝试在mylist类中定义一个mylist对象。

这是我的代码:

mlist.h

#ifndef MLIST_H
#define MLIST_H

#endif // MLIST_H

#include "mylist.h"

template <class T> class mlist
{
protected:
    T item = 0;
    mylist<T> next = 0;
};

mylist.h

#ifndef MYLIST_H
#define MYLIST_H

#include "mlist.h"

template <class T> class mylist : mlist<T>
{
private:
    T item;
    mylist<T>* next;

// --- some functions ---

};

#endif // MYLIST_H

错误:

  

错误:'mylist'没有命名类型

     

mylist next = 0;

我的问题:出了什么问题以及这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您无法在其定义中定义类的具体对象,因为在编译器看到对象定义时,它对其类一无所知。

但是,您可以在类的定义中定义指向同一个类的对象的指针。

此外,您的代码还存在循环依赖问题。

现在,为了解决这个问题,您必须在template class mylist的定义之前转发声明template class mlist。但是,如果您这样做,则会引入另一个问题,即您在class mylist的定义中不能有class mlist的具体对象。同样,这可以通过在class mylist的定义中定义指向class mlist对象的指针来解决:

template<class T> class mylist;

template <class T>
class mlist {
protected:
  T item;
  mylist<T>* next;
};

template <class T>
class mylist : mlist<T> {
  T item;
  mylist<T>* next;
};

int main() {
  mylist<int> lst;
  (void) lst;
}

LIVE DEMO

答案 1 :(得分:0)

  

我正在尝试在mylist类中定义一个mylist对象。

实际上,这不是你尝试做的一切。您尝试在my listmylist中同时拥有mlist成员。我认为你尝试使用C ++中不存在的东西 - 纯虚拟成员。行

protected:
 T item = 0;
 mylist<T> next = 0;

看起来你想要它。这也导致mlistmylist之间的相互依赖,因为您尝试在mylist中拥有mlist成员,并且您尝试从mylist派生mlist }。

删除我上面引用的行,你的编译错误应该消失。