Как я могу назвать вектор типа класса внутри другого класса? - PullRequest
0 голосов
/ 25 сентября 2019

Мне дали основное и сказали создать программу в ответ на основное, используя 3 класса.Класс парка развлечений, класс наездника и класс катания.Я хочу добавить райдера в вектор аттракционов и сохранить этот вектор в векторе парков развлечений.Что я делаю неправильно?Как я могу это исправить?

#include <iostream>
#include <string>

using namespace std;

class Rider
{
string name;
int height;
public:
    Rider(string name, int height)
    {
        this->name=name;
        this->height=height;
    }
    Rider(int height)
    {
        this->height=height;
    }
};
class Ride
{
    public:
    vector <Rider> all_riders;
};
class Amusement_park
{
    vector <Ride> all_rides;
    public:
        Amusement_park(int numRides)
        {
            all_rides[numRides];
        }
        vector <Rider> get_ride(int whichRide)
        {
            vector <Ride> the_ride= all_rides[whichRide];
            return the_ride;
        }
        void add_line(class Rider)
        {
            the_ride.pushback(Rider);
        }
};
int main()
{
    Rider r1("Yaris",45);   //name, height in inches
    Rider r2(49);           //height in inches
    Amusement_park a1(3);  //3 is the number of rides in the park
    a1.get_ride(1).add_line(r1); //add a rider to the line of a ride
    Amusement_park a2(2); //2 is the number of rides in the park
    a2.get_ride(1).add_line(r2); //add a rider to the line of a ride
    return  0;
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Я дам несколько советов для вашего кода, и один (или более) из них, вероятно, решит проблемы, которые могут у вас возникнуть.

Во-первых, всегда старайтесь использовать конструктор списки инициализаторов когда возможно.Обычно, когда конструктор очевиден, как и ваш, использование такого списка тривиально.В этом случае вы можете просто сделать:

    class Rider
    {
    string name;
    int height;
    public:
        Rider(string name, int height) : name(name), height(height) {}
        Rider(int height) : height(height) {}
    };

и то же самое для остальных ваших тривиальных конструкторов.

Теперь, если вы присмотритесь к своему c'tor для Amusement_park class, вы увидите, что вы пытаетесь получить доступ к индексу в vector, который, скажем, еще не определен.То есть у вас есть пустой вектор, который должен содержать объекты типа Ride, но, поскольку он пуст, попытка получить доступ к его содержимому (к любому индексу, который вы можете попытаться достичь) - это то, что мы называем неопределенное поведение .Это часть памяти, которую вы не знаете, что она содержит, и это потому, что вы никогда не сообщали своему компилятору, сколько там будет Ride объектов, чтобы ваша программа могла правильно распределить память и инициализировать объекты для вас.Для того, чтобы вы на самом деле создали вектор соответствующего размера или, точнее, правильно изменили размер вектора, ваш Amusement_park c'tor должен быть чем-то вроде

Amusement_park(int numRides)
    {
        all_rides.resize(numRides);
    }

Ваша get_ride функция внутриAmusement_park тоже не очень хорош.На самом деле, все ваше заявление a1.get_ride(1).add_line(r1) не делает то, что вы собираетесь.Во-первых, функция get_ride() возвращает vector из Rider, который не имеет функции-члена add_line().Вы действительно хотите, чтобы он возвращал объект Amusement_park, который является единственным в вашем коде, который имеет такую ​​функцию-член.Однако возвращать его нелогично, как вы можете видеть.

Короче говоря, ваш код содержит много недостатков, оба языка, как логически говоря.Следовательно, я рекомендую вам: 1) перепроверить логику вашего кода;2) Получить хорошую учебную книгу по C ++ для начала.

Удачи!

0 голосов
/ 25 сентября 2019

В вашей функции add_line(class Rider) нет ссылки на the_ride, чтобы подтолкнуть гонщика.Вы можете передать vector<Rider>, полученное из get_ride(int whichRide), в функцию, или вы можете просто объединить get_ride и add_line в одну функцию следующим образом:

void add_rider_to_line(int whichRide, class Rider)
{
    all_rides[whichRide].push_back(Rider);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...