C++ 类指针 作用域和局部变量的问题

类的定义就不复制出来了
void main()
{
employee *head , *p ;
head = p = NULL ;
char a = 'a';
while( a!= '0')
{
cout << "输入管理人员请按1\n输入计时工请按2\n输入计件工请按3\n输入销售人员请按4\n停止输入请按0\n\n请输入选择:" << endl ;
cin >> a ;
cout << endl ;
switch( a )
{
case '1' :
p = input1( p ) ;
if( head == NULL )
{
head = p ;
}
break ;
case '0':
break ;
default :
cout << "输入错误!" << endl << endl ;
}
cout << endl ; //head 和 p 运行到这行发生变化
}
}

其中在倒数第三行,指针head 和 p 的值没有改变,但是指针所指的类的内部数据全部都初始化了,据同学说这是因为
“这几个都是局部变量 遇到}后作用域结束 值都被压栈回去了”
表示看不懂,然后在这里求原因和解决办法,在线等
这是input1函数,然后head 和p 都是虚基类指针,不能new。请问要怎么解决
employee* input1( employee *&p )
{
long number;
char name[20];
long telephone;
double salary;
cout << "请依次输入 编号 姓名 电话 工资:" << endl ;
cin >> number >> name >> telephone >> salary ;
manager A( number , name , telephone , salary );
if( p != NULL )
{
p->next = &A ;
}
p = &A ;
return p ;
}

第1个回答  2011-08-17
看代码,似乎想通过输入,创建一个链表。
在C中,需要在堆里申请内存,然后指针指向堆里的地址。不要在栈上申请内存。如果在栈上申请内存,函数调用完毕,内存就被释放了。
内存申请,需要手动去。比如用malloc,或者用new, 用完记得释放。
关键在:p = input1( p ) ; 在这个函数中,需要申请内存。追问

好像就是这个问题,但是我的head 和p都是基类指针
employee *p = new employee;
是错误的操作,这样要怎么办?input1 函数也贴出来了,麻烦再帮忙看看可以吗

第2个回答  2011-08-17
这个问题是因为你使用了局部作用域的类的地址
不是像你说的全部初始化了
而是由于局部作用域中的manager A脱离了作用域后被自动析构了
在原来位置上的值都是未定义的
相当于你在main函数中定义一个Int,但不给它赋值,你调试的时候你就会发现这个int的值很奇怪
解决的方法就是用new申请分配内存块
既然你说基类是纯虚的,那么就用new manager
直接分配你想要操作类的内存

这样改函数
//manager A( number , name , telephone , salary );这删掉
if( p != NULL )
{
p->next = new manager( number , name , telephone , salary );
}

至于你后面那个p=&A我就没看懂了,既然是链表,一个是储存自己的东西,一个当然要储存
下一个单位的地址,具体的实现你也没贴出来,所以我只好给你说你只有这样申请内存才不会出现未定义情况本回答被提问者采纳
第3个回答  2011-08-17
你不把代码粘出来谁知道input1是神马意思?还有employee是表示类的话也不见指针开辟空间
第4个回答  2011-08-17
对问题不太清楚, 运行的过程中输入的是1么?然后 input1 函数做了什么呢?追问

input1就一输入链表数据的函数,在里面对p所指的类赋值之后,程序运行到
“cout << endl ; //head 和 p 运行到这行发生变化”
的时候,p保存的地址值没变化,但是p所指的类的数据全部初始化了,这不知道是为什么,据说是作用域问题

追答

就这样看基本找不出问题来。一直不明白你说的什么类数据全部初始化是什么个意思。

相似回答