重载>>运算符给我运行时错误C++

1 c++ operator-overloading

谁能帮我.下面是我正在尝试执行的代码.没有编译时错误,但是当控件转到字符串复制语句时程序崩溃.我试图修复它差不多一个小时,但仍然没有成功.

#include <iostream>

using namespace std;

class test
{
      private:
              char* name;
      friend istream& operator >>(istream&, test&);
};

istream& operator >> (istream& is, test& t)
{
          char c[20];

          cout << "enter something";
          is >> c;
          strcpy(t.name, c);
          return is;
}

int main()
{
    test obj;
    cin >> obj;

}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 7

name指针由要调用的时间未初始化strcpy,这给你的程序未定义行为.

要避免这种问题,请使用std::string而不是C字符串.更具体地说,通过这种方式重新定义您的课程:

#include <string> // Needed for std::string

class test
{
private:
    std::string name;
    friend istream& operator >>(istream&, test&);
};
Run Code Online (Sandbox Code Playgroud)

为了使您的程序编译,您可以通过operator >>这种方式调整您的重载:

istream& operator >> (istream& is, test& t)
{
    cout << "enter something";
    is >> t.name;
    return is;
}
Run Code Online (Sandbox Code Playgroud)

但是请注意,你不应该提示用户提供信息里面的提取运算符(即超载内operator >>).插入操作符仅用于test从输入流中提取类型的对象.

因此,提供一个完整的例子:

#include <iostream>
#include <string>

class test
{
private:
    std::string name;
    friend std::istream& operator >>(std::istream&, test&);
};

std::istream& operator >> (std::istream& is, test& t)
{
    is >> t.name;
    return is;
}

int main()
{
    test obj;
    std::cout << "enter something: ";
    std::cin >> obj;
}
Run Code Online (Sandbox Code Playgroud)

还要避免使用using指令,例如:

using namespace std;
Run Code Online (Sandbox Code Playgroud)

特别是如果在命名空间范围内,特别是在标题中(不是你的情况,但仍然) - 它们往往会导致与std命名空间中存在的实体发生名称冲突.


编辑:

由于您似乎不允许使用std::string,因此只有原始答案的第一句仍然有效 - 并且可能是您应该向用户询问输入的部分.

所以,这是你可以分配写什么t.name一个拷贝用户的字符串输入的:

t.name = strdup(c);
Run Code Online (Sandbox Code Playgroud)

您需要包含<cstring>标准标题strdup():

#include <cstring>
Run Code Online (Sandbox Code Playgroud)

我还建议nametest类的构造函数中初始化指向null 的指针- 它不会被隐式生成的默认构造函数初始化:

class test
{
    test() : name(nullptr) { } // Use NULL instead of nullptr in C++03
private:
    char* name;
    friend istream& operator >> (istream&, test&);
};
Run Code Online (Sandbox Code Playgroud)

所以在一个完整的程序中:

#include <iostream>
#include <cstring>

class test
{
public:
    test() : name(nullptr) { }
private:
    char* name;
    friend std::istream& operator >>(std::istream&, test&);
};

std::istream& operator >> (std::istream& is, test& t)
{
    char c[20];
    is >> c;
    t.name = strdup(c);
    return is;
}

int main()
{
    test obj;
    std::cout << "enter something: ";
    std::cin >> obj;
}
Run Code Online (Sandbox Code Playgroud)