标题:问一道指针对象的题目。
只看楼主
a924677591
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-9-30
结帖率:0
已结贴  问题点数:15 回复次数:6 
问一道指针对象的题目。
问题 D: 指针对象(类和对象实验二)

时间限制: 1 Sec  内存限制: 128 MB
提交: 193  解决: 127
[提交][状态][讨论版]
题目描述

 在前面章节内容里已经学习了数组和指针之间的关系,现在对象数组练习题的基础上,把对象数组改为对象指针重新实现同一功能,看看使用对象指针与普通类型指针有何不同?比如要构造三个学生类对象,只能使用指针动态分配方法实现(new 指令),最后,我们对初始化后的n个对象中的姓名字段属性按升序排序,输出排序后的各对象姓名属性,特别要注意的是对对象指针初始化需要注意什么(提示:可以在类外面定义一个方法,该方法的参数是对象指针/数组,对传入的对象按要求进行排序输出)。

输入

第一行输入需要n个测试对象

每行依次输入各对象的属性

输出

输出排好序后的对象姓名属性,每行一个

样例输入

2
Tom 男 2012222222 计算机学院 13333333333
John 男 2013333333 计算机学院 12444444444
样例输出

John
Tom
//------------------------
#include <iostream>
using namespace std;
class student{
    char *name, *ID, *sex, *institute, *phone;
    public:
        void set_infor(char *name1, char *sex1, char *ID1, char *institute1, char *phone1)
        {
            name = name1;
            ID = ID1;
            sex = sex1;
            institute = institute1;
            phone = phone1;
        }
        char *getname(){
            return name;
        }
        char *getID(){
            return ID;
        }
        char *getsex(){
            return sex;
        }
        char *getinstitute(){
            return institute;
        }
        char *getphone(){
            return phone;
        }
        void output(){
            cout<<name<<endl;
        }
};
int main ()
{
    student *stu;
    char name[100], ID[11], sex[3], institute[100], phone[12];
    int i, n;
    cin>>n;
    stu = new student [n];
    for (i = 0; i < n; i++)
    {
        cin>>name>>sex>>ID>>institute>>phone;
        stu[i].set_infor(name, sex, ID, institute, phone);
    }
    for (i = 0; i < n; i++)
    stu[i].output();
}
//-----------
用这代码输入
2
Tom 男 2012222222 计算机学院 13333333333
John 男 2013333333 计算机学院 12444444444
出现的结果却是
John
John
//--------------
为什么会这样??是不是set_infor函数里指针的赋值不正确??能否详细的解释一下??为什么set_infor里的指针会一直指向栈内存里的name1, sex1, ID1, institute1, phone1???
希望能详细解释下,谢谢了!!!
搜索更多相关主题的帖子: 练习题 动态 姓名 
2017-04-09 11:05
a924677591
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-9-30
得分:0 
求大佬们解答 谢谢!
2017-04-09 21:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:8 
直接写属性再读出来看看就清楚是否输入问题。
2017-04-10 08:42
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:8 
 void output(){
            cout<<name<<endl;
        }
你这里就是输出name 那不就是最后一次输入的name吗  所以输出那样结果 一点也不奇怪呀

DO IT YOURSELF !
2017-04-10 19:59
a924677591
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-9-30
得分:0 
回复 4楼 wp231957
class student{
    char *name, *ID, *sex, *institute, *phone;
    public:
        void set_infor(char *name1, char *sex1, char *ID1, char *institute1, char *phone1)
        {
            name = name1;
            ID = ID1;
            sex = sex1;
            institute = institute1;
            phone = phone1;
        }
是不是因为这里的name, ID, sex, institute, phone是在堆空间里的指针, 然后给他赋了栈空间里的name1, sex1, ID1, institute1, phone1。才使得name, ID。。。这些指针一直指向栈空间里的指针??
2017-04-11 22:02
a924677591
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-9-30
得分:0 
有人吗?方便回答吗 谢谢
2017-05-08 22:27
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
这很正常啊,你对象数组每个类对象的属性指针指向的是相同的变量,就是你定义的“char name[100], ID[11], sex[3], institute[100], phone[12];”,所以输出的结果就都一样了,将你的main函数修改如下,可得到你想要的结果:
程序代码:
int main ()
{
    student *stu;
    char *p;
    int i, n;
    cin>>n;
    stu = new student [n];
    for (i = 0; i < n; i++)
    {
        p=new char[230];
        cin>>p>>p+100>>p+111>>p+114>>p+214;
        stu[i].set_infor(p, p+100, p+111, p+114, p+214);
    }
    for (i = 0; i < n; i++)
    stu[i].output();
}


[此贴子已经被作者于2017-5-9 06:54编辑过]

2017-05-09 06:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475922-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021121 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved