读书人

String类的输入操作符gt;gt;怎么重载

发布时间: 2013-09-08 15:21:21 作者: rapoo

String类的输入操作符>>如何重载
如题,String类只有一个私有成员char* m_data,如何重写它的输入操作符?我纠结的点在于,要把is输入到m_data中,则必须给m_data申请空间,那么申请多少合适呢,即流中输入的字符长度是未知的,所以无法预先申请空间。

另外,如果限制String的长度,例如1024,则可以先把流写到长为1024 + 1的char数组里,然后根据字符串长度申请内存,然后拷贝到m_data,但是这样应该是不符合Sting类的设计初衷的。

请高手指教!


friend istream &operator>>(istream& is, String& str);
[解决办法]
以前看写过,没记错的话,是这样的


istream& operator >> (istream& is, String& str)
{
char ch;
char test[1024*2] = {0};
int i = 0;
while (is >> ch)
{
test[i] = ch;
i ++;
}
test[i] = '\0';
if( str.p != NULL )
delete [] str.p;
str.m_data = new char[i + 1];
str.m_len = i;
strcpy(str.m_data, test);
return is;
}

[解决办法]
malloc
realloc
[解决办法]
引用:
Quote: 引用:

malloc
realloc


这样应该可以,但是C++的标准用法是用new/delete这种的,有没有用C++风格实现的方法呢,谢谢

http://en.cppreference.com/w/cpp/memory/allocator
[解决办法]
std::istream &StringS::InputStr(std::istream &is)
{
char c;
size_type_s count = 0;


size_type_s calcu = 10;
m_string = new char[calcu];
while(is >> c)
{
if(count == calcu - 1)
{
calcu *= 2;
char *copy = m_string;
m_string = new char[calcu];
for(size_type_s i=0; i!=count; ++i)
{
m_string[i] = copy[i];
}
delete []copy;
m_string[count++] = c;
}
else
{
m_string[count++] = c;
}
}
m_string[count] = '\0';
return is;
}

std::istream &operator >>(std::istream &is, StringS &c_str)
{
return c_str.InputStr(is);
}

这是我今天没事写的,但是这个就是有一点不行,不能实现string类型那样,当我输入字符串时,无法忽略中间空格后面的字符,这个主要是while的原因,我也不知道怎么搞,所以还在思考中。。。。希望楼主也帮忙想想吧!谢谢!

读书人网 >C++

热点推荐