Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为将尝试使用的对象返回NULL?(获取核心转储--C+;+;新手)_C++_Oop - Fatal编程技术网

C++ 为将尝试使用的对象返回NULL?(获取核心转储--C+;+;新手)

C++ 为将尝试使用的对象返回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

好吧,我不得不重写我所有的代码和帖子,所以我希望能得到帮助。我有两门课:人事经理和个人。人事经理的目的是跟踪所有人员和人员姓名。这是我的全部代码:

main.cpp

#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()。有一个潜在的攻击性方法名称。当我重命名时,我没有看到这个名称…抱歉。我会修复它。我不再需要此名称,但有很多信息。谢谢,我以后会使用。我不再需要此名称,但有很多信息,谢谢,我以后会使用