读书人

问一个基本有关问题关于申明

发布时间: 2012-02-16 21:30:36 作者: rapoo

问一个基本问题,关于申明~
这样写,可以编译
class ilist_item{
public:
ilist_item(int value,ilist_item *item=0);
~ilist_item(){};
private:
int _value;
ilist_item *_next;
};

class ilist{
public:
ilist():_at_front(0),_at_end(0),_size(0){}
void insert(ilist_item *ptr, int value);
int size();

private:
//防止调用这两个函数,引发不必要的错误
ilist(const ilist&);
ilist& operator=(const ilist&);
ilist_item *_at_front;//定义了指针,没有调用构造函数
ilist_item *_at_end;
int _size;
};


这样写的话,编译的时候会提示ilist_item没有构造函数:
class ilist_item;

class ilist{
public:
ilist():_at_front(0),_at_end(0),_size(0){}
void insert(ilist_item *ptr, int value);
int size();

private:
//防止调用这两个函数,引发不必要的错误
ilist(const ilist&);
ilist& operator=(const ilist&);
ilist_item *_at_front;//定义了指针,没有调用构造函数
ilist_item *_at_end;
int _size;
};

class ilist_item{
public:
ilist_item(int value,ilist_item *item=0);
~ilist_item(){};
private:
int _value;
ilist_item *_next;
};


但是为什么没有提示我重复定义的错误呢?

把 class ilist_item;改为:
extern class ilist_item;
出现一个警告: warning C4091: “extern ” : 没有声明变量时忽略“ilist_item”的左侧
这个警告的意思是什么?



[解决办法]
第二种写法的第一行:class ilist_item;
只是一个声明,告诉编译器后面有这个的定义。所以不会有重复定义的错误
[解决办法]
而且我在VC2005中试过,第二种写法(不用extern)没错误啊
[解决办法]
class ilist_item;
这叫作类声明
包含{};的才叫作类定义
你试着的写一个class ilist_item{};就会提示了

读书人网 >C++

热点推荐