全局对象的声明放在类构造函数外部定义相对位置问题???高手指点下

时间:2021-02-04 10:51:07
class aa
{
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;// 

#4


aa::aa(){pa.pt=this;} //你构造函数里面为什么要用到pa

#5


引用 2 楼 coverallwangp 的回复:
构造bb对象test的时候,需要先调用基类aa的构造函数,但是你的aa构造函数写到后面去了,就找不到了,所以报错


就算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;// 

#4


aa::aa(){pa.pt=this;} //你构造函数里面为什么要用到pa

#5


引用 2 楼 coverallwangp 的回复:
构造bb对象test的时候,需要先调用基类aa的构造函数,但是你的aa构造函数写到后面去了,就找不到了,所以报错


就算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还没生成(或者说没有完全生成??)

希望有高手具体分析下全局类对象产生的过程。。。