While 循环不工作并且程序退出

问题描述 投票:0回答:1

初学者来了。

目前正在进行一项需要应用聚合的练习。问题是我的 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;
}
c++ loops while-loop menu aggregation
1个回答
0
投票

问题是

address
类的
Ship
成员是一个从未分配或初始化的指针。

然后当您使用

address->...
取消引用它时,例如在
read()
中,您会触发 未定义行为 (UB)。 当 UB 发生时,C++ 标准明确不保证程序的行为方式,因此推理它是没有意义的。

您可以通过分配一个对象并在

address
的构造函数中使用其地址初始化
Ship
来解决此问题。

但在这种情况下,

address
根本没有理由成为指针。
您可以简单地将其更改为:

Address address;

然后更改所有取消引用它的地方以使用

.
而不是
->
,例如:

address.set(r, c);

(而不是

address->set(r, c);
)。

© www.soinside.com 2019 - 2024. All rights reserved.