| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 521 人关注过本帖
标题:大家来瞧瞧
只看楼主 加入收藏
chenriwei1
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-4-23
收藏
 问题点数:0 回复次数:4 
大家来瞧瞧
请大家来帮我看看这代码:
#include <string.h>
#include <stdio.h>

/**
 * There're some serious issues in class Base and Subclass. 
 * You should check for current and POTENTIAL bugs in them,
 * especially memory problems.
 */

class Base
{
  private:
    char * name;
  public:
    Base(char * className)
    {
        name = new char[strlen(className)];
        strcpy(name, className);
    }

    ~Base()
    {
        delete name;
    }

    char * copyName()
    {
        char newname [256];
        strcpy(newname, name);
        return newname;
    }

    virtual char * getName()
    {
        return name;
    }

    static void print(Base base)
    {
        printf("name: %s\n" , base.name);
    }
};

class Subclass : public Base
{
  public:
    Subclass(char * className) : Base(className)
    {
    }
};

int main()
{
    Base * pBase = new Subclass("test");
    Base::print(*pBase);
    printf("name: %s\n", pBase->getName());
    printf("new name: %s\n", pBase->copyName());

    return 0;
}

搜索更多相关主题的帖子: especially problems private current include 
2006-05-05 00:55
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
收藏
得分:0 

提醒一点注意字符串是以\0结尾的哦,要多分配一个字节


http://kongfuziandlife. http://codeanddesign.
2006-05-05 08:36
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
收藏
得分:0 
Base::print(*pBase);
为什么不用Base.print(*pBase);
不懂,请指教!

奋斗改变一切!!
2006-05-05 11:52
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
老大,你读了题目没?
是要你找出严重的错误啊!

name = new char[strlen(className)+1];

return newname;//返回的局部变量的地址,局部变量在块结束后就失去意义

char * copyName()
{
return this;
}
静态成员函数怎么可以用非静态成员做参数呢?书上好象说不行。

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-05 13:07
weijun_yang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-5-6
收藏
得分:0 
weijun_yang

#include <string.h>
#include <stdio.h>

class Base
{
private:
char *name;

public:
Base(char *className)
{
if (NULL == className)
{
name = new char[1];
*name = '\0';
}
else
{
name = new char[strlen(className)+1];
strcpy(name, className);
}
}

~Base()
{
delete [] name;
}

char * copyName()
{
/*char newname [256];
strcpy(newname, name);
return newname; */
char *pNewName = name;
return pNewName;

}

virtual char * getName()
{
return name;
}

static void print(Base &base)
{
printf("name: %s\n" , base.name);
}
};

class Subclass : public Base
{
public:
Subclass(char * className) : Base(className)
{
}
};

int main(void)
{
Base * pBase = new Subclass("test");
Base::print(*pBase);
printf("name: %s\n", pBase->getName());
printf("new name: %s\n", pBase->copyName());

return 0;
}

注意:(建议去读读C/C++高质量程序设计)
1。strcpy(name, className); // strcpy 复制时带 '\0', 所以 new 的时候应该多分配一个字符。
2。return newname; 不要返回指向栈内存的指针或引用,因为函数返回后栈回收。
3。static void print(Base base) 参数应该写成引用方式(Base &base),因为你没有编写拷贝构造函数与复制函数。

2006-05-06 00:49
快速回复:大家来瞧瞧
数据加载中...
 
   



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

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