C++ 为将尝试使用的对象返回NULL?(获取核心转储--C+;+;新手)
好吧,我不得不重写我所有的代码和帖子,所以我希望能得到帮助。我有两门课:人事经理和个人。人事经理的目的是跟踪所有人员和人员姓名。这是我的全部代码: main.cppC++ 为将尝试使用的对象返回NULL?(获取核心转储--C+;+;新手),c++,oop,C++,Oop,好吧,我不得不重写我所有的代码和帖子,所以我希望能得到帮助。我有两门课:人事经理和个人。人事经理的目的是跟踪所有人员和人员姓名。这是我的全部代码: main.cpp #include <string> #include <sstream> #include <iostream> #include <map> using namespace std; class Person { public: Person(); void SetNam
#include <string>
#include <sstream>
#include <iostream>
#include <map>
using namespace std;
class Person
{
public:
Person();
void SetName(string s) {Name_ = s;}
string GetName() const {return Name_;}
private:
string Name_;
};
Person::Person()
{
Name_ = "";
}
class PersonManager
{
public:
PersonManager();
void NewPerson(string);
void GetRidOfPerson(string);
Person *GetPerson(string);
void Close();
private:
map<string, Person *> PersonMap_;
};
PersonManager::PersonManager()
{
PersonMap_.clear();
}
void PersonManager::NewPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return; // person already exists
}
}
Person *person = new Person;
PersonMap_.insert(pair<string, Person *>(name, person));
cout << "Created person: " << name << ".\n";
}
Person *PersonManager::GetPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return it->second;
}
}
cout << "Person: " << name << " not found." << endl;
return NULL;
}
void PersonManager::GetRidOfPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
delete it->second;
PersonMap_.erase(it);
cout << "Deleted person: " << name << ".\n";
return;
}
}
cout << "Couldn't find person " << name << " for deletion.\n";
}
void PersonManager::Close()
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
delete it->second;
PersonMap_.erase(it);
cout << "Deleted person: " << it->first << ".\n";
}
PersonMap_.clear();
}
int main(void)
{
PersonManager person_manager;
person_manager.NewPerson("Tom");
person_manager.NewPerson("Tom");
person_manager.GetRidOfPerson("Tom");
person_manager.GetRidOfPerson("Abel");
person_manager.GetPerson("Tom")->SetName("Bob");
cout << person_manager.GetPerson("Tom")->GetName() << endl;
cout << person_manager.GetPerson("Bob")->GetName() << endl;
person_manager.Close();
return 0;
}
然后你就这么做了
person_manager.GetPerson("Tom")->SetName("Billy");
然后试着做:
person_manager.GetPerson("Tom")->GetName();
它将返回NULL,然后返回segfault
因此,在这个片段中:
Person *PersonManager::GetPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return it->second;
}
}
cout << "Person: " << name << " not found." << endl;
return NULL;
}
问题在于,我有未分配的内存。还有别的办法吗
感谢您的帮助,谢谢 使用类的实际实例,然后返回引用,而不是返回带有指向
Person
的指针的映射。如果找不到Person
,则返回一个静态成员变量,类似于map::end()
大概是这样的:
class PersonManager
{
public:
// ...
Person &GetPerson(string);
static Person NoSuchPerson;
private:
map<string, Person> PersonMap_;
};
Person PersonManager::NoSuchPerson;
Person &PersonManager::GetPerson(string name)
{
for (map<string, Person>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return it->second;
}
}
cout << "Person: " << name << " not found." << endl;
return NoSuchPerson;
}
class人事管理器
{
公众:
// ...
Person&GetPerson(字符串);
静态人与非静态人;
私人:
地图人物地图;
};
Person PersonManager::NoSuchPerson;
Person和PersonManager::GetPerson(字符串名称)
{
对于(map::iterator it=PersonMap_u2;.begin();
it!=PersonMap_u2;.end();
it++)
{
if(it->first.compare(name)==0)
{
返回->秒;
}
}
cout不返回带有指向Person
指针的映射,而是返回类的实际实例,然后返回引用。如果找不到Person
,则返回静态成员变量,类似于map::end()
的操作
大概是这样的:
class PersonManager
{
public:
// ...
Person &GetPerson(string);
static Person NoSuchPerson;
private:
map<string, Person> PersonMap_;
};
Person PersonManager::NoSuchPerson;
Person &PersonManager::GetPerson(string name)
{
for (map<string, Person>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return it->second;
}
}
cout << "Person: " << name << " not found." << endl;
return NoSuchPerson;
}
class人事管理器
{
公众:
// ...
Person&GetPerson(字符串);
静态人与非静态人;
私人:
地图人物地图;
};
Person PersonManager::NoSuchPerson;
Person和PersonManager::GetPerson(字符串名称)
{
对于(map::iterator it=PersonMap_u2;.begin();
it!=PersonMap_u2;.end();
it++)
{
if(it->first.compare(name)==0)
{
返回->秒;
}
}
在使用之前,请检查从GetPerson
返回的值是否为NULL
。大致如下:
Person *person = person_manager.GetPerson("Tom");
if (person == NULL) {
std::cout << "Tom not found!" << std::endl;
} else {
// Do stuff with person
}
Person*Person=Person\u manager.GetPerson(“汤姆”);
if(person==NULL){
std::cout在使用之前,检查从GetPerson
返回的值是否为NULL
。大致如下:
Person *person = person_manager.GetPerson("Tom");
if (person == NULL) {
std::cout << "Tom not found!" << std::endl;
} else {
// Do stuff with person
}
Person*Person=Person\u manager.GetPerson(“汤姆”);
if(person==NULL){
我看到了几个问题。首先,至少从我对你的理解来看
代码,PersonManager::PersonMap\u0中使用的键是完全独立的
在实际的个人中的任何数据中。因此,顺序:
person_manager.NewPerson("Tom");
person_manager.GetPerson("Tom")->SetName("Billy")
std::cout << person_manager.GetPerson("Tom")->GetName() << std::endl;
person\u manager.NewPerson(“汤姆”);
person\u manager.GetPerson(“汤姆”)->SetName(“比利”)
std::cout GetName()我看到了几个问题。首先,至少从我对您的
代码,PersonManager::PersonMap\u0中使用的键是完全独立的
在实际的个人中的任何数据中。因此,顺序:
person_manager.NewPerson("Tom");
person_manager.GetPerson("Tom")->SetName("Billy")
std::cout << person_manager.GetPerson("Tom")->GetName() << std::endl;
person\u manager.NewPerson(“汤姆”);
person\u manager.GetPerson(“汤姆”)->SetName(“比利”)
std::cout GetName()您可能需要重命名PersonManager::PersonGinger()。存在一个可能令人反感的方法名称。在重命名时,我没有看到该名称…抱歉。我会解决此问题。您可能需要重命名PersonManager::PersonGinger()。有一个潜在的攻击性方法名称。当我重命名时,我没有看到这个名称…抱歉。我会修复它。我不再需要此名称,但有很多信息。谢谢,我以后会使用。我不再需要此名称,但有很多信息,谢谢,我以后会使用