首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-09-08 
String类的输入操作符如何重载如题,String类只有一个私有成员char* m_data,如何重写它的输入操作符?我纠

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的原因,我也不知道怎么搞,所以还在思考中。。。。希望楼主也帮忙想想吧!谢谢!

热点排行