无法访问或显示返回的“字符串”

Adi*_*ste 0 c++ string pointers return vector

目前,我正在做一个小项目,叫做“献血”。我在那里使用了类和继承概念。

当新的“献血者”到来时,我获取它的信息,创建新对象并将对象的地址存储到“指针向量”中。但是当我尝试访问一个人的名字时,我没有得到任何信息,我可以访问其他信息......

找累了,bug在哪里......

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <unistd.h>

using namespace std;

int intCheck(string str){
      for(int i=0;i<str.length();i++){
            if (!(str[i] >= 48 && str[i] <= 57) )  return 0;
      }
      return stoi(str);
}
long long int longCheck(string str){
      for(int i=0;i<str.length();i++){
            if (!(str[i] >= 48 && str[i] <= 57) )  return 0;
      }
      return stoll(str);
}
class bloodBank{
      private:
            // ORDER : A+ B+ AB+ O+ A- B- AB- O-

            static int totalBlood;
            static int bloodGroupsRecords[8];
            static int maleDonars;
            static int femaleDonars;
            static int totalDonars;

      public:
            static string bloodGroups[8];
            static void display_totalBlood(){
                  cout << "\n Total Blood In The Blood Bank :: " << totalBlood << " ML "  << "( " << totalBlood/(float)1000 << " ) Ltr.";
            }
            static void display_gender_donars(){
                  cout << "\n   Male Donars   : " << maleDonars ;
                  cout << "\n   Female Donars : " << femaleDonars ;
            }
            static void display_group_donars(){
                  for (int i=0;i<8;i++){
                        cout << setw(5) << bloodGroups[i];
                        cout << " : " << bloodGroupsRecords[i];
                  }
            }
            static void increaseMD(){
                  maleDonars++;
            }
            static void increaseFD(){
                  femaleDonars++;
            }
            static void increaseTB(int blood){
                  totalBlood += blood;
            }
            static void addBloodToCategory(int bGroup,int bAmount){
                  bloodGroupsRecords[bGroup] += bAmount;
            }
};
int bloodBank :: totalBlood=0;
int bloodBank :: bloodGroupsRecords[8] = {0};
int bloodBank :: maleDonars=0;
int bloodBank :: femaleDonars=0;
int bloodBank :: totalDonars = maleDonars + femaleDonars;
string bloodBank :: bloodGroups[8] = {"A+","B+","AB+","O+","A-","B-","AB-","O-"};


class donate:public bloodBank{
      private:
            string name;
            string village;
            int bloodGroup;
            int gender;
            long long int phone;
            int age;
            int amount;
      public:
            void set_name(){
                  cout << "Enter Your Name : ";
                  getline(cin,name);
            }
            string get_name(){ cout << "Hello From get_name" ; return name;}
            void set_village(){
                  cout << "Enter Your Village : ";
                  getline(cin,village);
            }
            string get_village(){ return village;}
            int set_age(){
                  string s_age;
      
                  cout << "Enter Your Age : ";
                  getline(cin,s_age);

                  age = intCheck(s_age);
                  if (!(age >= 18 && age <=65)) { cout << "Enter The Age Properly & Age Must B/W 18 - 65 \n";set_age();}
                  return 1;
            }
            int get_age(){ return age;}
            int set_phone(){
                  string s_phone;
      
                  cout << "Enter Your Phone : ";
                  getline(cin,s_phone);

                  phone = longCheck(s_phone);
                  if ((!phone) || (s_phone.length() > 12 || s_phone.length() < 6)) { cout << "Enter Your Phone Number Correctly \n";set_phone();}
                  return 1;
            }
            long long int get_phone(){ return phone;}
            int set_bloodGroup(){
                  cout << "Choose Your Blood Group : \n";
                  cout << "1) A+ 2) B+ 3) AB+ 4) O+ \n";
                  cout << "5) A- 6) B- 7) AB- 8) O- \n";

                  string s_bg;
                  getline(cin,s_bg);
                  bloodGroup = intCheck(s_bg);

                  if(!((bloodGroup >= 1) && (bloodGroup <=8))){ cout << "Please Choose The Correct Blood Group \n"; set_bloodGroup();} 
                  return 1;     
            }
            int get_bloodGroup(){ return bloodGroup;}
            int set_amount(){
                  string s_amount;

                  cout << "Enter Amount To Donate(ml) : ";
                  getline(cin,s_amount);

                  amount = intCheck(s_amount);
                  if (!(amount >= 100 && amount <= 500)){ cout << "Minimum Limit : 100 ML & Maximum Limit : 500 ML \n"; set_amount();}
                  return 1;
            }
            int get_amount(){ return amount;}
            int set_gender(){
                  string s_gender;
                  cout << "Select Your Gender : \n1) Male \n2)Female \n";
                  getline(cin,s_gender);

                  gender = intCheck(s_gender);
                  if ((gender == -1) || (gender > 2) || (gender < 1)) { cout << "Please Select A Proper Number 1 or 2 \n";set_gender();}
                  else{
                        (gender == 1 )? gender = 1: gender = 2;
                  }
                  return 1;
            }
            int get_gender(){ return gender; }
            void updateData(){
                  get_gender() == 1 ? increaseMD() : increaseFD();
                  increaseTB(get_amount());
                  addBloodToCategory(get_bloodGroup(),get_amount());
            }
};


// --- BloodBank Database ---
vector<donate *> blood_bank_database;

// --- Donars Info ---
void donarsList(){
      vector<donate *> :: iterator it = blood_bank_database.begin();

      cout <<"normal";
      cout << blood_bank_database[0]->get_gender();
      cout << blood_bank_database[0]->get_name();
      while(it != blood_bank_database.end()){
            cout << "Name Of Donar : " << (*it)->get_name() << "Amount Of Blood Donated : " << (*it)->get_amount() ;
            it++;
      }
}
void menu(){
      cout << "===== WELCOME TO BLOOD DONATION CAMP ====\n\n";

      cout << "Use The Follwing Commands : \n";
      cout << "1) Donate The Blood \n";
      cout << "2) List Of Blood Donars \n";
      cout << "3) Amount Of Blood Donated \n";
      cout << "4) About Us \n";
      cout << "5) EXIT \n\n";
}
void createDonar(){

      donate d1;

      d1.set_name();
      d1.set_village();   
      d1.set_gender();
      d1.set_age();
      d1.set_phone(); 
      d1.set_bloodGroup();  
      d1.set_amount(); 
      d1.updateData();
      blood_bank_database.push_back(&d1);
      cout << "-- Thanks For Donating :) --\n";
}
void bloodDonated(){
      cout << "------------------------------------\n";

      bloodBank::display_totalBlood() ;
      bloodBank::display_gender_donars() ;
      bloodBank::display_group_donars() ;

      cout << "\n------------------------------------\n";
}
void aboutUs(){
      cout << "-----------------------------------------------------\n";

      cout << "\n    _-_-_ | OPEN-EYES BLOOD CAMP | _-_-_\n";
      cout << "\n         ! Donate Blood, Save Life !     \n";

      cout << "\n\n-- Near Grand Park, NewWay Street, CALIFORNIA --\n\n";
      cout << "-----------------------------------------------------\n";

}

int main(){

      createDonar();
      // donarsList();
      
      bloodDonated();

      auto it = blood_bank_database.begin();
      cout << (*it)->get_gender();
      cout << (*it)->get_name();
      
      return 0;
}

Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 5

void createDonar(){

      donate d1;
Run Code Online (Sandbox Code Playgroud)

d1对象在此函数的自动作用域中声明。这意味着d1当该函数返回时,它会被销毁。它将会消失。它将不再有。它将不复存在。它将成为一个前对象。当您static在函数中声明非变量和对象时,函数返回时它们会发生什么,这就是 C++ 的工作方式。

blood_bank_database.push_back(&d1);
Run Code Online (Sandbox Code Playgroud)

然后,同一函数将指针推d入 this std::vector,然后返回。那么,这里已经完成了什么?这就是这里完成的,最终结果:向量充满了指向被破坏对象的指针,并且这些指针的所有后续使用都变成了未定义的行为。

此类问题的总称称为“指针的无意义使用”。这是因为当不需要指针时,使用指针无法完成任何有价值的事情。blood_bank_database可以简单地是一个

vector<donate> blood_bank_database;
Run Code Online (Sandbox Code Playgroud)

其余代码也相应调整。最终结果会更加简单,并且不易出错。