Tulis program untuk mengimplementasikan pointer ke objek di kelas TRAIN. Train_Number , Train_Name, Arrival_Hr ,Arrival_Min, TimeDiff() adalah anggota di kelas. Fungsi anggota TimeDiff() digunakan untuk mencari perbedaan waktu antara Waktu Kedatangan (Arrival_Hr dan Arrival_Min) dan Reached Time (Jam dan Min baru yang diberikan untuk kedatangan terlambat) dan menampilkan selisih waktu yang dihitung dari kereta yang ditentukan. Gunakan pointer ke array objek untuk kereta yang berbeda.

Apakah program ini merupakan jawaban yang benar untuk pertanyaan tersebut? Saya bertanya karena saya tidak tahu apa artinya "Gunakan pointer ke array objek untuk kereta yang berbeda".

Ini adalah kode yang saya buat:

#include <iostream>

using namespace std;

class TRAIN{
    public: int Train_Number;
    public: string Train_Name;
    int Arrival_Hr;
    int Arrival_Min;
    TRAIN(int Hr1,int Mn1, int Hr2, int Mn2) {
        Arrival_Hr = Hr2-Hr1;
        Arrival_Min = Mn2-Mn1;
        cout<<Arrival_Hr<<"Hr"<<Arrival_Min<<"min is the difference";
    }
};

int main(){
    TRAIN* ptr[10];
    ptr[0] = new TRAIN(2,30,4,40);
    ptr[1] = new TRAIN(1,20,5,30);
    ptr[0]->Train_Number = 100;
    ptr[0]->Train_Name = "Jansadabti";
    cout<<ptr[0]->Train_Number;
    cout<<ptr[0]->Train_Name;
    return 0;
}
c++
0
Cosmos396 10 Januari 2021, 10:40

3 jawaban

Jawaban Terbaik

Program ini merupakan awal yang baik, tetapi apa adanya tidak menjawab pertanyaan yang diajukan dengan benar.

Anda melewatkan metode TimeDiff(). Apa yang telah Anda masukkan ke dalam konstruktor TRAIN seharusnya ada di metode TimeDiff().

Pertanyaannya meminta "penunjuk ke array objek", tetapi Anda menggunakan "array pointer ke objek" sebagai gantinya.

Coba sesuatu yang lebih seperti ini:

#include <iostream>
using namespace std;

class TRAIN{
    public:
        int Train_Number;
        string Train_Name;
        int Arrival_Hr;
        int Arrival_Min;

        int TimeDiff(int Reached_Hr, int Reached_Min) const {
            int a_mins = (Arrival_Hr * 60) + Arrival_Min;
            int r_mins = (Reached_Hr * 60) + Reached_Min;
            return r_mins - a_mins;
        }
};

int main() {
    TRAIN* trains = new TRAIN[10];

    trains[0].Train_Number = 100;
    trains[0].Train_Name = "Jansadabti";
    trains[0].Arrival_Hr = 2;
    trains[0].Arrival_Min = 30;

    // populate other trains as needed...

    cout << trains[0].Train_Number << " " << trains[0].Train_Name << ", Time Difference: " << trains[0].TimeDiff(4, 40) << " minute(s)";

    delete[] trains;

    return 0;
}

4
Remy Lebeau 10 Januari 2021, 10:04

Banyak jawaban, tetapi tidak ada yang menyarankan untuk menggunakan std::vector.

Anda membocorkan memori. Tidak ada delete untuk new Anda. Dalam C++ modern, kita akan menggunakan smart pointer, yaitu std::unique_ptr<Train> trains[10], yang merupakan array smart pointer. Dan lebih logisnya, kita akan menggunakan pointer ke array yang dialokasikan secara dinamis: std::unique_ptr<Train[]> trains(new Train[10]). Namun, jauh lebih baik menggunakan std::vector<Train> trains.

Contoh

struct Time {
    int hour;
    int minute;
};

struct TimeSpan {
    int hours;
    int minutes;
};

TimeSpan operator- (Time const& lhs, Time const& rhs) {
    TimeSpan ts {
        lhs.hour - rhs.hour,
        lhs.minute - rhs.minute };
    if (ts.minutes < 0) {
        ts.minutes += 60;
        ts.hours -= 1;
    }
    // and need something for when hours < 0, i.e. 0:30 - 23:30
    // with the exception for the case that you actually want a negative timespan...
    return ts;
}

#include <iostream>
std::ostream& operator<< (std::ostream& os, TimeSpan const& ts) {
    os << ts.hours << " hours and " << ts.minutes << " minutes";
    return os;
}

#include <string>
struct Train {
    int number;
    std::string name;
    TimeSpan travelTime;

    Train(Time const& departure, Time const& arrival)
    : number{/*?*/1}
    , name{/*?*/"name"}
    , travelTime{arrival - departure} 
    {}
};

std::ostream& operator<< (std::ostream& os, Train const& train) {
    os << "Train nr. " << train.number
       << " named " << train.name
       << " has a travel time of " << train.travelTime;
    return os;
}

#include <vector>

int main(){
    std::vector<Train> trains;
    trains.emplace_back(Train{Time{2,30},Time{4,40}});
    trains.emplace_back(Train{Time{1,20},Time{5,30}});
    trains[0].number = 100;
    trains[0].name = "Jansadabti";
    
    for (auto const& train: trains) {
        std::cout << train << '\n';
    }
}
2
Remy Lebeau 10 Januari 2021, 10:09

Apa yang Anda gunakan adalah array pointer ke objek tetapi pertanyaannya mengatakan menggunakan pointer ke array objek. Saya kira ini berarti array harus dibuat secara dinamis seperti yang ditunjukkan di bawah ini. Perhatikan bahwa biasanya UPPERCASE nama biasanya digunakan untuk konstanta, jadi saya mengubah namanya menjadi Train. Juga, tujuan konstruktor adalah untuk menginisialisasi anggota kelas, bukan untuk melakukan perhitungan. Gunakan metode (TimeDiff()) untuk penghitungan:

#include <string>
#include <iostream>
class Train {
public: 
    int Train_Number;
    std::string Train_Name;
    int Arrival_Hr;
    int Arrival_Min;
    Train(int number, std::string name, int hr, int min) 
    :  Train_Number(number), Train_Name(name), Arrival_Hr(hr), Arrival_Min(min)  
    {
        //empty body since I have used a member initializer list
    }
    Train() {} //empty constructor to allow array creation
    void TimeDiff(int new_hr, int new_min, int& diff_hr, int& diff_min)
    {
        diff_hr = new_hr - Arrival_Hr;
        diff_min = new_min - Arrival_Min;
    }
    // Overloading << so that you can use Train objects with std::cout
    friend std::ostream& operator<<(std::ostream& out, Train train);
};

std::ostream& operator<<(std::ostream& out, Train train)
{
    out << "\nTrain No: " << train.Train_Number;
    out << "\nTrain Name: " << train.Train_Name;
    out << "\nArrival Time: " << train.Arrival_Hr << ":" << train.Arrival_Min;
    return out;
}
int main()
{
    Train* t_array;
    t_array = new Train[10]; // Dynamically allocates a dynamic array of size 10 and returns a pointer to the base address

    t_array[0].Train_Number = 100;
    t_array[0].Train_Name = "Jansadabti";
    t_array[0].Arrival_Hr = 2;
    t_array[0].Arrival_Min = 30;
    //OR
    t_array[0] = Train(100, "Jansadabti", 2, 30);

    int diff_hr, diff_min;

   
   std::cout << t_array[0] << std::endl; // Possible because << is overloaded
   std::cout << "New Time: " << 4 << ":" << 40 << std::endl;

   t_array[0].TimeDiff(4, 40, diff_hr, diff_min);
   std::cout << "Time Difference: " << diff_hr << "hr " << diff_min << "min ";
    
     delete[] t_array; // Always delete dynamically allocated memory.
    return 0;
}

Jika ada sesuatu yang tidak jelas, beri tahu saya, saya akan membaginya untuk Anda. Juga, cobalah untuk tidak menggunakan using namespace std, itu mengacaukan namespace global. Pada akhirnya, ini adalah C++, di mana seseorang akan selalu mengeluh tentang kode Anda yang tidak cukup optimal.

0
Amal K 10 Januari 2021, 09:32