初学者来了。
目前正在进行一项需要应用聚合的练习。问题是我的 while 循环不起作用。它应该在第一次显示后显示回菜单选项,并再次读取输入等等,但它会退出程序。
#include <iostream>
#include <string>
using namespace std;
class Address{
private:
string registrar;
string country;
public:
void set(string r, string c){
registrar = r;
country = c;
}
string getRegistrar(){
return registrar;
}
string getCountry(){
return country;
}
};
class Ship{
private:
string name;
string yearMade;
Address *address;
public:
void print(){
cout<<"Ship Name: "<< name <<endl;
cout<<"Year Built: "<< yearMade <<endl;
cout<<"Registered at: "<<endl<<address->getRegistrar()<<", "<<address->getCountry()<<endl;
}
void read(){
string r, c;
cout<<"<<< Enter the information of the ship >>>"<<endl<<endl;
cout<<"Ship Name: ";
getline(cin, name);
cout<<"Year Built: ";
getline(cin, yearMade);
cout<<"The address the ship was registered:"<<endl;
cout<<"Registrar Office: ";
getline(cin, r);
cout<<"Country: ";
getline(cin, c);
address->set(r, c);
}
};
int main() {
Ship *ship = new Ship[100];
int option=0, total=0;
while(option != 3){
cout<<"======== MENU ========"<<endl;
cout<<"1. Add a ship"<<endl;
cout<<"2. Display ships"<<endl;
cout<<"3. Exit."<<endl<<endl;
cout<<"Choose an operation => ";
cin >> option;
cin.ignore();
if(option == 1){
ship[total].read();
total++;
}else if(option == 2){
cout<<"<<< Inventory of ships >>>"<<endl<<endl;
cout<<"Total ship: "<<total<<endl<<endl;
cout<<"==== Ship List ===="<<endl<<endl;
for(int i=0; i<total; i++){
ship[i].print();
}
}
}
return 0;
}
问题是
address
类的 Ship
成员是一个从未分配或初始化的指针。
然后当您使用
address->...
取消引用它时,例如在 read()
中,您会触发 未定义行为 (UB)。
当 UB 发生时,C++ 标准明确不保证程序的行为方式,因此推理它是没有意义的。
您可以通过分配一个对象并在
address
的构造函数中使用其地址初始化 Ship
来解决此问题。
但在这种情况下,
address
根本没有理由成为指针。Address address;
然后更改所有取消引用它的地方以使用
.
而不是 ->
,例如:
address.set(r, c);
(而不是
address->set(r, c);
)。