首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过载插入器<< -是否进行深度复制

过载插入器<< -是否进行深度复制
EN

Stack Overflow用户
提问于 2014-05-04 10:59:50
回答 1查看 123关注 0票数 0

我创建了一个string类,在其他类中重载插入器<<和提取器>>。但是这里出了一些问题,尽管我使用了一个复制构造函数,在这里我获取了对象成员变量的深度副本。我怀疑我需要在重载插入器>> (cin)的函数中做同样的事情,但是我不知道怎么做。

发生的情况是,当用户在conselewindow中输入他的名字时,cout什么也不返回。下面是控制台中的场景

代码语言:javascript
复制
Enter a name:

例如,用户输入Sally并输出控制台。

代码语言:javascript
复制
your name is: 

没什么大不了的。

所以我的问题是:

  • 为什么调用重载函数后没有留下字符串数组?
  • 我应该在这里复印一份吗?如果-我该如何实施。
  • 这个问题还有其他原因吗?

非常感谢您的帮助!

代码语言:javascript
复制
#include <iostream>

using namespace std;

class String {
   int str_len;

public:
   char *string;
   // default constructor
String() {
    str_len = 100;
    string = new char[str_len]();
    cout << "initialiserat default-constructor!\n";
}
// destrcutor
~String() {
    delete [] string;
    string = 0;
}


// copy constructor
String (const String &string_obj) {

    str_len = string_obj.str_len;

    if (string_obj.string) {
        string = new char[str_len];
        strncpy(string, string_obj.string, str_len);
    } else {
        string = 0;
    }
}

// Overloading assignment-operator
String operator=(const String& string_obj) {

    if (this == &string_obj) {
        return *this;
    }
    delete [] string;

    str_len = string_obj.str_len;

    if(string_obj.string) {
        string = new char[str_len];
        strncpy(string, string_obj.string, str_len);
    } else {
        string = 0;
    }

    return *this;
}

};

// overloading inserter <<
ostream &operator<<(ostream &stream, String obj) {

    stream << obj.string;
    return stream;
}

// overloading extractor >>
istream &operator>>(istream &stream, String obj) {

   cout << "Enter a name: ";
   stream >> obj.string;

   return stream;
}


int main() {

   String string3;

   cin >> string3;

   cout << "your name is: " << string3 << endl;

   return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-04 11:06:14

这个运算符

代码语言:javascript
复制
istream &operator>>(istream &stream, String obj) {

   cout << "Enter a name: ";
   stream >> obj.string;

   return stream;
}

是无效的。参数String obj是函数的局部变量,在退出该函数后将被销毁。将运算符定义为

代码语言:javascript
复制
istream &operator>>(istream &stream, String &obj) {

   cout << "Enter a name: ";
   stream >> obj.string;

   return stream;
}

还将输出运算符定义为

代码语言:javascript
复制
ostream &operator<<(ostream &stream, const String &obj) {

    stream << obj.string;
    return stream;
}

考虑到当数据成员string被定义为公共时,它不是一个好的类设计。任何人都可以改变它。

代码语言:javascript
复制
class String {
   int str_len;

public:
   char *string;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23455409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档