{
public:
aa();
virtual void tt();
};
class bb: public aa
{
public:
void tt();
};
class point
{
public:
point();
aa* pt;
};
bb test;// 主要问题这里,如果test和pa的声明放在aa的构造函数外部定义的下面,程序报错 为什么??
point pa;//
aa::aa(){pa.pt=this;}
point::point(){}
void aa::tt(){cout<<"aaaaa";}
void bb::tt(){cout<<"bbbbb";}
int _tmain(int argc, _TCHAR* argv[])
{
(pa.pt)->tt();
}
---------------------------
像这样
aa::aa(){pa.pt=this;}
bb test;// 主要问题这里,如果test和pa的声明放在aa的构造函数外部定义的下面,程序报错 为什么??
point pa;//
这样程序就报错 如果用之前的顺序 就没问题 问什么啊 真搞不懂
5 个解决方案
#1
因为aa的构造函数使用了pa,你都没定义呢,怎么用。
#2
构造bb对象test的时候,需要先调用基类aa的构造函数,但是你的aa构造函数写到后面去了,就找不到了,所以报错
#3
可见域的问题
aa::aa(){pa.pt=this;} //且不论程序的意义 这里用到了pa 如果把point pa放在这句下面,那么pa就不可见了,编译器不知道这是啥,就报错了。、
//放前面,看的见,就没事了。
bb test;//
point pa;//
aa::aa(){pa.pt=this;} //且不论程序的意义 这里用到了pa 如果把point pa放在这句下面,那么pa就不可见了,编译器不知道这是啥,就报错了。、
//放前面,看的见,就没事了。
bb test;//
point pa;//
#4
aa::aa(){pa.pt=this;} //你构造函数里面为什么要用到pa
#5
就算pa在aa构造定义前,test放到后面,也依然可以执行
-----------------------------
point pa;
aa::aa(){pa.pt=this;}
point::point(){}
void aa::tt(){cout < <"aaaaa";}
void bb::tt(){cout < <"bbbbb";}
bb test;//这样程序都是对的
。。。
。。。
--------------------
只有pa定义的位置才是关键,况且
bb test;
point pa;
aa::aa(){pa.pt=this;}
point::point(){}
void aa::tt(){cout < <"aaaaa";}
void bb::tt(){cout < <"bbbbb";}
这样test定义的时候,pa也还没定义;当定义test的时候先调用了aa的构造函数,里面pa.pt已经可以赋值了,而这时候pa都还没有定义。。。这一点我就不是很明白了。。。可以在pa的构造函数里面弄个cout之类就知道,debug跟踪一下,test调用aa构造函数的时候pa.pt就赋值了,而pa的构造函数没有执行,就是说pa还没生成(或者说没有完全生成??)
希望有高手具体分析下全局类对象产生的过程。。。
#1
因为aa的构造函数使用了pa,你都没定义呢,怎么用。
#2
构造bb对象test的时候,需要先调用基类aa的构造函数,但是你的aa构造函数写到后面去了,就找不到了,所以报错
#3
可见域的问题
aa::aa(){pa.pt=this;} //且不论程序的意义 这里用到了pa 如果把point pa放在这句下面,那么pa就不可见了,编译器不知道这是啥,就报错了。、
//放前面,看的见,就没事了。
bb test;//
point pa;//
aa::aa(){pa.pt=this;} //且不论程序的意义 这里用到了pa 如果把point pa放在这句下面,那么pa就不可见了,编译器不知道这是啥,就报错了。、
//放前面,看的见,就没事了。
bb test;//
point pa;//
#4
aa::aa(){pa.pt=this;} //你构造函数里面为什么要用到pa
#5
就算pa在aa构造定义前,test放到后面,也依然可以执行
-----------------------------
point pa;
aa::aa(){pa.pt=this;}
point::point(){}
void aa::tt(){cout < <"aaaaa";}
void bb::tt(){cout < <"bbbbb";}
bb test;//这样程序都是对的
。。。
。。。
--------------------
只有pa定义的位置才是关键,况且
bb test;
point pa;
aa::aa(){pa.pt=this;}
point::point(){}
void aa::tt(){cout < <"aaaaa";}
void bb::tt(){cout < <"bbbbb";}
这样test定义的时候,pa也还没定义;当定义test的时候先调用了aa的构造函数,里面pa.pt已经可以赋值了,而这时候pa都还没有定义。。。这一点我就不是很明白了。。。可以在pa的构造函数里面弄个cout之类就知道,debug跟踪一下,test调用aa构造函数的时候pa.pt就赋值了,而pa的构造函数没有执行,就是说pa还没生成(或者说没有完全生成??)
希望有高手具体分析下全局类对象产生的过程。。。