如何通过朋友的功能将对象(类型a)传递给另一个对象(类型b)的私有对象(类型a)

How to pass an object(type a) to a private object(type a) of another object(type b) through function of friend

#include <iostream>
#include <vector>
using namespace std;

class Flight;

class Time {
   private :
      int hour;
      int minute;
   public :
      Time(int hour,int minute){

         this->hour = hour;
         this->minute = minute;

      };
      int getHour(){
         return hour;
      }
      int getMinute(){
         return minute;
      }
};

class Passenger{
   private:
      string name;
      int age;
   public :
      Passenger(string name , int age){

         this->name = name;
         this->age = age;

      }
      void printDetails(){

         cout << "Name: " << name << "\t";   
         cout << "Age: " << age <<"\t";              
      }
      friend void addPassenger(Passenger *p,int num,Flight f);
      friend Flight;
};

class Flight {

   private :
      string id;
      string destination;
      Time *depart;
      Time *arrival;
      vector<Passenger> passengerList;
      Passenger *pass;

   public :
      Flight(string id, string destination, Time *t, Time *a){

         this->id = id;
         this->destination = destination;
         depart = t;
         arrival = a;
         id = 3;
      };

      void printInfo(){
         cout<< "Flight Number : " << id << endl;
         cout<< "Destination : " << destination << endl;
         cout<< "Desparture : " << depart->getHour() << ":" << depart->getMinute()<< endl;
         cout<< "Arrival : " << arrival->getHour() << ":" << arrival->getMinute() << endl;
      }
      void printList(){

         cout << pass->name[0];

      }
      friend class Passenger;
      friend void addPassenger(Passenger *p,int num,Flight f);
};

void addPassenger(Passenger *p,int num,Flight f){

   //  for(int i=0;i<num;i++){

   //  f.passengerList.push_back(p[i]);
   f.pass->name = p->name;
   //  }

}

int main(){

   int num_passenger;
   int temp_age;
   string temp_name;

   vector<int> passenger_age;
   vector<string> passenger_name;

   Time t(2,4);
   Time t2(2,3);
   Flight ff("3","4",&t,&t2);

   cout<< "Enter the number of passenger" << endl;
   cin>> num_passenger;
   cout<< endl;

   Passenger *pas[num_passenger];

   for(int i=0;i < num_passenger; i++){

      cout<< "Enter the name of adult "<< i+1 << endl;
      cin>> temp_name;
      passenger_name.push_back(temp_name);
      cout<< "Enter the age of adult "<< i+1 << endl;
      cin>> temp_age;
      passenger_age.push_back(temp_age);


   }

   for(int p=0; p < num_passenger; p++){

      pas[p] =  new Passenger(passenger_name[p],passenger_age[p]);

   }
   addPassenger(*pas,2,ff);
   ff.printList();

   return 0;
}

我需要通过函数 addPassenger 将 Passenger Class 的数组对象传递到 Flight Class 内部的 Passenger Class 的私有数组对象中。 一切都编译正常,但我无法让 printList(object Flight) 工作,它只是跳出并终止控制台。

抱歉,由于项目的要求,它很复杂。 希望能得到一些帮助,谢谢。

问题 1

主要问题在行

f.pass->name = p->name;

问题的根源是Flight的成员变量pass没有正确初始化,然后你继续使用f.pass就好像它是一个有效的指针。

问题2

函数 addPassengerFlight 对象作为输入。当您调用该函数时,该函数会获取原始 Flight 对象的副本。对 addPassenger 中的 Flight 对象所做的任何更改都是针对本地副本,而不是来自 main.

的对象

通过以下更改,我能够 运行 您的程序没有任何问题。

  1. Flight的变量成员更改为:

    string id;
    string destination;
    Time *depart;
    Time *arrival;
    vector<Passenger> passengerList;
    

    删除了成员变量 pass.

  2. addPassenger 的签名更改为。

    void addPassenger(std::vector<Passenger> const& plist, Flight& f);
    

    并将其实现更改为

    void addPassenger(std::vector<Passenger> const& plist, Flight& f)
    {
       for(auto& p : plist ){
          f.passengerList.push_back(p);
       }
    }
    
  3. Flight::printList 的实现更改为:

    void printList(){
       for(auto& p : passengerList ){
          cout << p.name << endl;
       }
    }
    
  4. mainpas 的类型更改为:

    std::vector<Passenger> pas;
    

需要更改其他内容以解决这些更改。这是完整的程序:

#include <iostream>
#include <vector>
using namespace std;

class Flight;

class Time {
   private :
      int hour;
      int minute;
   public :
      Time(int hour,int minute){

         this->hour = hour;
         this->minute = minute;

      };
      int getHour(){
         return hour;
      }
      int getMinute(){
         return minute;
      }
};

class Passenger{
   private:
      string name;
      int age;
   public :
      Passenger(string name , int age){

         this->name = name;
         this->age = age;

      }
      void printDetails(){

         cout << "Name: " << name << "\t";   
         cout << "Age: " << age <<"\t";              
      }
      friend void addPassenger(std::vector<Passenger> const& plist, Flight& f);
      friend Flight;
};

class Flight {

   private :
      string id;
      string destination;
      Time *depart;
      Time *arrival;
      vector<Passenger> passengerList;

   public :
      Flight(string id, string destination, Time *t, Time *a){

         this->id = id;
         this->destination = destination;
         depart = t;
         arrival = a;
         id = 3;
      };

      void printInfo(){
         cout<< "Flight Number : " << id << endl;
         cout<< "Destination : " << destination << endl;
         cout<< "Desparture : " << depart->getHour() << ":" << depart->getMinute()<< endl;
         cout<< "Arrival : " << arrival->getHour() << ":" << arrival->getMinute() << endl;
      }

      void printList(){
         for(auto& p : passengerList ){
            cout << p.name << endl;
         }
      }

      friend class Passenger;
      friend void addPassenger(std::vector<Passenger> const& plist, Flight& f);
};

void addPassenger(std::vector<Passenger> const& plist, Flight& f)
{
   for(auto& p : plist ){
      f.passengerList.push_back(p);
   }
}

int main(){

   int num_passenger;
   int temp_age;
   string temp_name;

   vector<int> passenger_age;
   vector<string> passenger_name;

   Time t(2,4);
   Time t2(2,3);
   Flight ff("3","4",&t,&t2);

   cout<< "Enter the number of passenger" << endl;
   cin>> num_passenger;
   cout<< endl;

   std::vector<Passenger> pas;

   for(int i=0;i < num_passenger; i++){

      cout<< "Enter the name of adult "<< i+1 << endl;
      cin>> temp_name;
      passenger_name.push_back(temp_name);
      cout<< "Enter the age of adult "<< i+1 << endl;
      cin>> temp_age;
      passenger_age.push_back(temp_age);


   }

   for(int p=0; p < num_passenger; p++){
      pas.push_back(Passenger(passenger_name[p],passenger_age[p]));
   }

   addPassenger(pas, ff);
   ff.printList();

   return 0;
}

http://ideone.com/Chttoe 查看它的工作情况。