关于C++vector容器存放对象的问题,这个bug实在搞不懂

清源Eamonmon 2017-08-01 08:14:08
简单来说就是存放person类对象,然后运用迭代器遍历输出他们的信息
Person.h
#ifndef Person_hpp
#define Person_hpp

#include <iostream>
#include <cstring>
using namespace std;

class Person{
public:
Person();
Person(char* name,int age);
Person(Person& p);
bool operator<(Person& p);
Person& operator=(Person& p);
friend ostream& operator<<(ostream& out,Person& p);
void print();
~Person();

private:
char* name;
int age;
};

#endif /* Person_hpp */

Person.cpp
#include "Person.hpp"
Person::Person(){
name = new char[1];
name[0] = '\0';
age = 0;
}

Person::Person(char* _name,int _age){
name = new char[strlen(_name)+1];
strcpy(name, _name);
age = _age;
}

Person::Person(Person& p){
name = new char[strlen(p.name+1)];
strcpy(name, p.name);
age = p.age;
}

bool Person::operator<(Person& p){
if(age<p.age){
return false;
}
else{
return true;
}
}

Person& Person::operator=(Person& p){
if(this!=&p){
if(name){
delete [] name;
name = NULL;
}
name = new char[strlen(p.name)+1];
strcpy(name, p.name);
age = p.age;
}
return *this;
}

ostream& operator<<(ostream& out,Person& p){
out<<"name:"<<p.name<<endl;
out<<"age:"<<p.age<<endl;
return out;
}

void Person::print(){
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
}

Person::~Person(){
if(name){
delete [] name;
name = NULL;
}
}


main.cpp
#include <vector>
#include <iterator>
#include <iostream>
#include "Person.hpp"
using namespace std;
int main(int argc, const char * argv[]) {
//vector<Person*> vec;
vector<Person> vec;
Person p1("Mike",25);
Person p2("John",22);
vec.push_back(p1);
vec.push_back(p2);
vector<Person>::iterator ite;
//vec.push_back(&p1);
//vec.push_back(&p2);
//vector<Person*>::iterator ite;
for(ite = vec.begin();ite!=vec.end();++ite){
// cout<<**ite<<endl;
cout<<*ite<<endl;
}

return 0;
}


运行报错

然后如果是vector<Person*>的话就没有报错,难道是不能存对象吗?
...全文
320 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
huang5hun 2017-08-01
  • 打赏
  • 举报
回复
STL使用的是值引用, 所以自定义类需要提供拷贝构造函数和operator=函数,这两个函数的原型是 Person( const Person& ); Person& operator=( const Person& );
sdghchj 2017-08-01
  • 打赏
  • 举报
回复
如果你没有专门定义带右值引用参数的函数,请记得在你最好在你的函数参数引用前加上const关键字,否则无法匹配临时变量的传参。 Person(const Person& p); Person& operator = (const Person& p); bool operator<(const Person& p); friend ostream& operator<<(ostream& out,const Person& p);

64,688

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧