Cout没有返回任何输出
Cout not returning any output
我正在学习c++,发现了一个我不理解的问题。我有一个简单的代码:
#include <iostream>
#include <vector>
class Person
{
string * name;
public:
Person(const string & n) : name {new string {n}} {}
~Person() {delete name;}
string getName() const {return *name;}
};
int main()
{
vector<Person> people;
people.push_back(Person("Tom"));
cout << "Name is: " << people.back().getName() << endl;
return 0;
}
当我运行它时,我没有输出。不知道为什么?然而,当我做类似的事情,但没有矢量时,一切都可以:
int main()
{
Person tom {"Tom"};
cout << "Name is: " << tom.getName() << endl;
return 0;
}
正如其他人所说,最好不要使用指针。然而,如果您想知道发生了什么,那么得到的原因是在这一行中创建了people.push_back(Person("Tom"));
Person对象,并将其副本传递给vector。但是,一旦复制了对象,就会执行析构函数,从而删除字符串。
使用指针时,原始Person对象及其副本都指向内存中的同一字符串。字符串被析构函数删除,并且副本中的name
指针不指向任何内容。因此,你会得到不明确的行为。
要纠正这个问题,要么不使用指针,要么需要定义自己的复制构造函数。例如:
class Person
{
string * name;
public:
Person(const string & n) : name {new string {n}} {}
// copy constructor which makes new string in memory
//based on the original string.
Person(const Person & other) {
name = new string(other.getName());
}
~Person() { delete name; }
string getName() const {return *name;}
};
您使用了错误的类型。您的string
已经是字符串类型。这样写代码。
class Person
{
public:
Person (const string& n) : name(n) { }
~Person() {}
string getName() const { return name; }
private:
string name;
};
如果您坚持在成员变量中使用指针,则应覆盖复制构造函数和重载赋值运算符。
举个例子:
class Person
{
public:
Person (const char* n) : name(new char[strlen(n)+1]) { strcpy(name, n); }
Person (const Person& p) : name(new char[strlen(p.name)+1]) { strcpy(name, p.name); }
~Person() { delete [] name; }
Person& operator=(const Person& p)
{
if ( &p == this ) return *this;
delete [] name;
name = new char[strlen(p.name)+1];
strcpy(name, p.name);
return *this;
}
string getName() const { return name; }
private:
char* name;
};
您的代码有缺陷的原因已经解释过了,但如果您有C++11,则可以使用emplace_back
:
people.emplace_back("Tom");
尽管如此,使用指针而不是普通成员变量只是不必要地使程序复杂化。你必须做的内存管理越少越好。阅读零规则。更好的是,如果您的getName()
函数没有做任何特殊的事情,请删除它,然后将name
公开。
相关文章:
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 代码编译没有任何输出,入门程序
- 可能我知道为什么这段代码没有给出任何输出吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么下面的Hello World程序在PowerShell上没有显示任何输出?同一程序在CMD上显示正确的输出
- 执行此代码时,它不显示任何输出.为什么?
- 合并排序没有给我任何输出
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 当我从头文件和实现文件调用我的函数到我的主文件时,我没有得到任何输出
- 为什么我在链表中插入的代码没有得到任何输出?
- 后缀Expressrion的插图未显示任何输出
- 不显示任何输出
- VS Code C++程序在调试时不显示任何输出
- 当我使用继续时,程序不提供任何输出
- 该代码在 Dev-C++ 中没有给我任何输出
- Cereal 找不到任何输出序列化函数
- C++ 中的侵蚀函数不给出任何输出
- Ocamlopt不会产生任何输出,只有错误代码
- 当我从java代码执行C++时不显示任何输出
- 这个看似无害的代码不会产生任何输出