请问这个类的输入操作符重载函数应该怎样写啊?

烂笔头Danky 2004-11-19 01:27:52
下面这样一个类:
class String
{
friend ostream& operator<<(ostream&, const String&);
public:
String() { initialize(); }
String(const char *str) { initialize(str); }
String(const String &rhs) { initialize(rhs); }
~String() { delete [] _string; }
String& operator=(const String&);
String& operator=(const char*);
private:
int _size;
char *_string;
void initialize();
void initialize(const char*);
void initialize(const String&);
};

它的输出操作符重载函数我是这样写的,但输入操作符重载函数不知道怎么写,请赐教!
ostream& operator<<(ostream &os, const String &rhs)
{
os <<rhs._string;
return os;
}
...全文
294 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
liem 2004-12-03
  • 打赏
  • 举报
回复
String的无参构造函数没有为_string指针分配空间。
我想String对象要有三个数据成员:
int _size;//空间大小,可以按块计数,比如每块64字节
int _chcount;//字符个数
char *_string;
输入时如果输入的字符数不超过_size*64,则直接输入,否则为对象增加空间

我设计的一个增加空间的的一种方法,是仿链表法,在类中再增加一个数据成员char *_temp.如果输入的字符数超过_size*64,则为_temp分配一块内存。输入完毕,则分配适当大小的空间以容纳_string+_temp,复制后再撤消原先分配的空间。如果_temp空间也用完,将_string与_temp合并成_string,再为_temp分配空间。
烂笔头Danky 2004-12-01
  • 打赏
  • 举报
回复
请问怎样增加动态分配呢?不太明白啊,如果可以的话请写出详细的代码!
csdnlady 2004-12-01
  • 打赏
  • 举报
回复
那就再增加动态内存分配啊
烂笔头Danky 2004-11-30
  • 打赏
  • 举报
回复
我是这样写的:istream& operator >> (istream &is, String &rhs)
{
const int size = 128;
char *temp = new char[size];
is >>temp;
rhs._size = strlen(temp);
rhs._string = new char[rhs._size+1];
strcpy(rhs._string, temp);
return is;
}

但这有一个问题是我这是申请一个临时的128个字节的空间来接收输入的字符串,但我并不能知道用户输入的字符串个数每次都小于128个,即如果用户输入的字符串个数大于128的话这个程序将会出错(同样的楼上所写的也是预先分配255个字节的空间,如果输入的字符串个数大于255的话程序也会出错),那到底有没有更好的解决方法呢?
zjraycj 2004-11-29
  • 打赏
  • 举报
回复
//这个VC6中已通过
#include <iostream.h>
#include <stdlib.h>
//using namespace std;//不带.h,在VC6中好象对输入输出的友元不支持

class Str //最好不要用string 因为系统中已有一个这样的类了;
{
public:
friend istream& operator>>(istream&, Str&);
friend ostream& operator<<(ostream&, const Str&);

Str() {_string =new char [255]; }
~Str() { delete [] _string; }
private:
int _size;
char *_string;
void initialize();
};

//输入输出操作符重载函数
istream& operator>>(istream &is, Str &rhs)
{
is >> rhs._string;
return is;
}
ostream& operator<<(ostream &os, const Str &rhs)
{
os <<rhs._string;
return os;
}

//私有初始化函数
//inline void Str::initialize()
//{
// _size=255;
// _string =new char [_size];
//}

//-----------------------------
void pause()
{
system("pause");
}

int main()
{
atexit(pause);
Str string2;

cout<<"请输入一个字符串给string2:";
cin>>string2;
cout<<"string2:"<<string2<<endl;
return 0;
}
烂笔头Danky 2004-11-29
  • 打赏
  • 举报
回复
请问有谁知道标准库中的类string中的输入操作符重载函数是怎么实现的呢?
allen_zhaozhencn 2004-11-24
  • 打赏
  • 举报
回复
ostream& operator<<(ostream &os, const String &rhs)
{
os <<rhs._string; //应该确保: _string是一个以\0结束的字符串指针.
return os;
}
烂笔头Danky 2004-11-21
  • 打赏
  • 举报
回复
难道不能在输入函数里按照输入的字符串再给_string分配适合的空间吗?那标准库中的string类的输入函数是怎样做的呢,难道也是预先给用户分配一个不知道需要用多少的空间吗?
Daydreamnet 2004-11-21
  • 打赏
  • 举报
回复
你的_string变量都还没有分配空间怎么可以这样直接输入呢?
应该在构造函数里面给它分配一个空间,然后在析构函数里面释放才对的。
inline void String::initialize()
{
_size = 0;
_string =new char[255];
}
sharkhuang 2004-11-21
  • 打赏
  • 举报
回复
inline void String::initialize()
{
_size = 200;
_string = new char[200];
}
烂笔头Danky 2004-11-21
  • 打赏
  • 举报
回复
哎呀.........我快受不了了,不行啊,你们所说的都是基本相同的,我都试了还是执行输入的时候出错,请帮我试试下面的这个程序能否通过:

#include <iostream>
#include <stdlib.h>
using namespace std;

class String
{
friend istream& operator>>(istream&, String&);
friend ostream& operator<<(ostream&, const String&);
public:
String() { initialize(); }
~String() { delete [] _string; }
private:
int _size;
char *_string;
void initialize();
};

//输入输出操作符重载函数
istream& operator>>(istream &is, String &rhs)
{
return is >> rhs._string;
}
ostream& operator<<(ostream &os, const String &rhs)
{
os <<rhs._string;
return os;
}

//私有初始化函数
inline void String::initialize()
{
_size = 0;
_string = 0;
}

//-----------------------------
void pause()
{
system("pause");
}

int main()
{
atexit(pause);

String string1;
cout <<"请输入一个字符串给string1:";
cin >>string1;
cout <<"string1:" <<string1 <<endl;
}
koalapheonix 2004-11-20
  • 打赏
  • 举报
回复
ostream& operator<<(ostream &os, const String &rhs)
{
os <<rhs._string;
return os;
}
istream &operator >>(istream &input,String &rhs)
{ cout<<"enter sentence";
input>>rhs._string;
return input;
}
烂笔头Danky 2004-11-19
  • 打赏
  • 举报
回复
meiggy(宝宝贝贝),你这样怎么行呢,输入函数是要向rhs所指向的String对象写入数据,怎么还能把rhs定义成一个const的引用呢?

对于carylin(别信我,我在说谎) ,你所说的这个函数我已经试过了还是不行,还是一样的出现那样的错误!

我就是想不以怎样在这个输入操作符重载函数里给_string分配足够的内存空间!请大家再赐教!
meiggy 2004-11-19
  • 打赏
  • 举报
回复
呼呼,写好没有发,发了发现已经这么多兄弟发了,献丑了!
meiggy 2004-11-19
  • 打赏
  • 举报
回复
istream& operator>>(istream &os, const String &rhs)
{
is >> rhs._string;
return is;
}

sharkhuang 2004-11-19
  • 打赏
  • 举报
回复
——string是个指针只要你给他空间 并且输入不越界就没问题。
yuanye2008 2004-11-19
  • 打赏
  • 举报
回复
应该在构造函数中为指针_string分配空间!别忘了析构时清除。
我测试过!
烂笔头Danky 2004-11-19
  • 打赏
  • 举报
回复
我先前也是这样写的,可以成功编译,但在执行到输入语句时我输完后按回车主程序出错了,每次都是这样,说什么内存地址不能写什么的,我想应该是_string在类里只是定义了一个字符指针,还没有给它分配足够的内存空间吧!,请问carylin(别信我,我在说谎)你这样写你自己测试通过了吗?
carylin 2004-11-19
  • 打赏
  • 举报
回复
istream& operator>>(const istream &is, String &rhs)
{
return is >> rhs._string;
}

64,362

社区成员

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

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