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)
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)
其余代码也相应调整。最终结果会更加简单,并且不易出错。
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |