通过EditString的构造函数初始化基类String的构造函数时,私有成员len值总为0?

sunxden 2009-12-28 03:38:09
基类String派生出EditString类,但是通过EditString的构造函数初始化基类String的构造函数时,String类的私有成员len值总为0?

请各位友友提出详细点的解决办法,^_^
#include<iostream>
#include<cstdlib>
using namespace std;

class String
{
public:
String();
String(char* s);
~String();
int Getlen()const { return len; }
void SetString(char* ss); // 设置字符串
void Setlen(const int l) { len=l;}
void Show() { cout<<"输出字符串指针str所指向的内容:"<<str<<endl; }
public:
char *str;
private:
int len;
};

class EditString:public String
{
public:
EditString();
EditString( char* es );
~EditString();
void SetCursor( int s); // 光标定位函数
};

String::String()
{
len=0;
str=new char[1];
str[0]='\0';
cout<<"基类String被默认构造."<<endl;
}
String::String(char *s)
{
len=strlen(s);
str=new char[len+1];
for(int i=0;i<len;i++)
*(str+i)=*(s+i);
*(str+len)='\0';
cout<<"基类String被构造."<<endl;
}
String::~String()
{
delete[] str;
cout<<"基类被析构!"<<endl;
}
void String::SetString(char* ss)
{
delete[] str;
len=strlen(ss);
str=new char[len+1];
for(int i=0;i<len;i++)
*(str+i)=*(ss+i);
*(str+len)='\0';
}


EditString::EditString()
{
String::String();
cout<<"EditString类默认构造."<<endl;
}


EditString::EditString(char *es) // EditString构造函数
{
String::String(es); // 就是这里,为什么在传递指针给基类string时候,在string的构造函数中,字符串长度总是为0 ? 谁帮忙解决一下这个问题
cout<<"初始化字符长度为:"<<String::Getlen()<<endl;
cout<<"EditString类被构造."<<endl;
}


EditString::~EditString()
{
cout<<"EditString类被析构."<<endl;
}

void EditString::SetCursor( int s) // 实现光标"|"的定位功能
{
int i=0;
char *temp=new char[String::Getlen()+2]; // 新建一个指向字符型指针temp并将其初始化
for(;i<s;i++) // 以下两个for循环目的是插入字符"|",从而借此实现光标的定位
*(temp+i)=*(String::str+i);
*(temp+s)='|';
for(;i<String::Getlen()+1;i++)
*(temp+i+1)=*(String::str+i); ??? 这里可以这样实现把str所指向内容的值传过来吗?
*(temp+String::Getlen()+1)='\0';
cout<<"现在字符串为:"<<temp<<endl;
delete[] temp; // 释放指针temp所指向的内存空间
}

int main()
{
EditString ES("How are you.");
ES.SetCursor(6);
return 0;
}
...全文
73 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunxden 2009-12-29
  • 打赏
  • 举报
回复
我刚才又在机子上按照1,2,3楼所说的:EditString::EditString(char*es)
:String(es){//其他代码} ,运行了一遍,结果不如人所愿! 
然后再结合4楼的答复,我看了以后这样写了:

----程序完美运行。把这写在这里就是为了和大家分享一下,以后编程我会注意的,谢谢你们的意见! ^_^ ! ------

class String
{
public:
...............
String(char *s,int iLength); ...............
public:
char* str;
private:
...............
};

class EditString:public String
{
..................
};

String::String()
{
.................
}
String::String(char *s,int iLength)
{
len=iLength;

str=new char[len+1];
for(int i=0;i<len;i++)
*(str+i)=*(s+i);
*(str+len)='\0';
cout<<"基类String被构造."<<endl;
}
String::~String()
{
DeleteStr();
cout<<"基类被析构!"<<endl;
}

.....................


EditString::EditString(): String()
{
cout<<"EditString类默认构造."<<endl;
}


EditString::EditString(char *es): String(es,strlen(es))
{
cout<<"初始化字符长度为:"<<String::Getlen()<<endl;
cout<<"EditString类被构造."<<endl;
}


EditString::~EditString()
{
cout<<"EditString类被析构."<<endl;
}

void EditString::SetCursor( int s)
{
int i=0;
char *temp=new char[String::Getlen()+2];
for(;i<s;i++)
*(temp+i)=*(String::str+i); // &&&&&&&&:这里可以这样写,呵呵!
*(temp+s)='|';
for(;i<String::Getlen()+1;i++)
*(temp+i+1)=*(String::str+i);
*(temp+String::Getlen()+1)='\0';
cout<<"现在字符串为:"<<temp<<endl;
delete[] temp;
 }
job82824 2009-12-28
  • 打赏
  • 举报
回复
EditString::EditString(char *es)
呵呵,我想笑一下。C++里面没有形参和实参的分别,就是说,这里传递的es,编译器永远认为是个指针,而不是字符串,所以调用sizeof(es)的时候你不可能得到正确的字符串长度的,你得到的是指针本身长度,除非你在一段代码中同时含有两者,比如
void GetLength(char *p) { printf("%d", sizeof(p));};
...
{
char *p = "我是真正的字符串!"
int i = sizeof(p);//长度正确
GetLength(p);//长度出错
}

...

所以我们在传递字符串指针时一般都会增加一个形参int iLength的。
void GetContent(char *p, int iLength);

我当初也不理解形参和实参,和一个用Delphi的同事为此争论不休,后来才明白了
firsthym 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
你这不是构造基类对象
String::String(es);            //这样只是调用基类构造函数构造一个临时对象

正确的方法如下:

C/C++ code
EditString::EditString(char*es)
:String(es)//必须放在这个初始化列表{//其他代码}

[/Quote]
就是这样。
你将基类的构造函数放在花括号里面,那么EditString::EditString(char*es)实际上是调用String()缺省构造函数在构造基类子对象。如果你有String类的源码,你在其缺省构造函数里面打印,你就会看到。
横云断岭 2009-12-28
  • 打赏
  • 举报
回复
EditString::EditString(char *es) // EditString构造函数
{
String::String(es); // 就是这里,为什么在传递指针给基类string时候,在string的构造函数中,字符串长度总是为0 ? 谁帮忙解决一下这个问题
cout < <"初始化字符长度为:" < <String::Getlen() < <endl;
cout < <"EditString类被构造." < <endl;
}
String::String(es);
这个应该放到初始化列表里吧
arong1234 2009-12-28
  • 打赏
  • 举报
回复
你这不是构造基类对象
String::String(es); //这样只是调用基类构造函数构造一个临时对象

正确的方法如下:


EditString::EditString(char *es)
:String(es) //必须放在这个初始化列表
{
//其他代码
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧