谁能帮我.下面是我正在尝试执行的代码.没有编译时错误,但是当控件转到字符串复制语句时程序崩溃.我试图修复它差不多一个小时,但仍然没有成功.
#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)
该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)
我还建议name在test类的构造函数中初始化指向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)
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |