2016-11-12 2 views
-1

Привет всем, У меня возникли проблемы с нижеследующим назначением. Когда я запускаю код, все работает, но цифры, которые я получаю в распечатке, неточны. Не уверен, что это конструктор, который у меня установлен неправильно или что. Я просто ударился головой о стену, пытаясь понять это. Любая помощь/совет будут высоко оценены!C++ Конструктор Класс автомобиля

Вот текст Назначение:

Инструкции Класс автомобиля: Написать класс под названием 'Автомобиль', который имеет следующие переменные-члены:

год. Int, который удерживает модельный год автомобиля.

Марка. Строковый объект, который содержит марку автомобиля.

скорость. Объект int, который поддерживает текущую скорость автомобиля.

Кроме того, класс должен иметь следующие функции-члены:

Конструктора. Конструктор должен принять год автомобиля и внести переменные-члены. Конструктор должен инициализировать эти значения в год объекта и создавать переменные-члены. Конструктор должен инициализировать переменную переменной скорости до 0.

Аксессоры. Должны быть созданы соответствующие функции доступа, позволяющие извлекать значения из переменных года года, типа и скорости объекта.

Ускорение. Функция ускорения должна добавлять 5 к переменной члена скорости каждый раз, когда она вызывается.

Тормоз. Функция торможения должна вычитать 5 из переменной члена скорости каждый раз, когда она вызывается. Продемонстрируйте класс в программе, которая создает объект Car, а затем пять раз вызывает функцию ускорения. После каждого вызова функции ускорения получить текущую скорость автомобиля и отобразить его. Затем вызовите функцию торможения 5 раз. После каждого вызова функции торможения, получите текущую скорость автомобиля и отобразите его.

#include <iostream> 
#include <string> 

using namespace std; 
class Car 
{ 
    private: 
    int year; 
    string make; 
    int speed; 

    public: 
    Car(int, string, int); 
    int getSpeed(); 
    int getModel(); 
    void accelerate(); 
    void brake(); 


}; 

int Car::getSpeed() 
{ 
    return speed; 
} 

Car::Car(int year, string make, int speed = 0) 
{ 
} 

void Car::accelerate() 
{ 
    speed +=5; 
} 

void Car::brake() 
{ 
    if(speed > 5) 
     speed -=5; 
    else speed = 0 ; 
} 


int main() 
{ 
    int year; 
    string make; 
    cout << "Please enter the model year of the car.\n"; 
    cin >> year ; 
    cout << "Please enter the make of the car.\n"; 
    cin >> make ; 

    Car myCar(year,make); 
    int i = 0; 
    for (; i<5; ++i) 
    { 
     myCar.accelerate(); 
     cout << "Accelerating.\n" << "The current speed of the car is: " << myCar.getSpeed()<<endl; 
    } 

    { 
     int j = 0; 
     for (; j<5; ++j) 
     { 
      myCar.brake(); 
      cout << "Decelerating.\n" << "The current speed of the car is: " << myCar.getSpeed()<<endl; 
     } 

     return (0); 
    } 
} 
+0

Каков результат использования * отладчика *? Какое утверждение является виновником? Это было бы хорошим проектом для изучения использования отладчика. –

+0

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Я использую X-Code, не видя способ использования отладчика в этом приложении. При запуске кода нет сообщений об ошибках. –

ответ

1

Этот конструктор

Car::Car(int year, string make, int speed = 0) 
{ 
} 

не инициализирует ничего. Он имеет пустое тело и ни один список членов инициализации. Кроме того, согласно заданию конструктор должен иметь два параметра.

Это может выглядеть следующим образом

Внутри определения класса

inline Car(int year, std::string & make); 

и определения самого конструктора

Car::Car(int year, const std::string make) : year(year), make(make), speed(0) 
{ 
} 

Аксессоры может быть объявлен как

int getYear() const; 
int getSpeed() const; 
const std::string & getModel() const; 
^^^^^^^^^^^^^^^^^^^ 
1

Конструктор

Car::Car(int year, string make, int speed = 0) 
{ 
} 

не делает то, что вы описываете. Эти три параметра (year, make и speed) имеют те же имена, что и Car s, но являются отдельными переменными.

Результатом является то, что элементы по умолчанию сконфигурированы, а значения, переданные main(), фактически игнорируются.

Чтобы сделать все более ясным, укажите аргументы разных имен и инициализируйте их в списке инициализаторов.

Car::Car(int y, string m, int s) : year(y), make(m), speed(s) 
{ 
} 

Допустимо аргументы имеют те же имена, как члены класса, но это, как правило, труднее читать то, что легче понять то, что делает код. В вашем случае вы считаете, что предоставление параметров тем же именем, что и членам класса, служит для инициализации членов класса, и это неверно. В любом случае конструктор должен явно инициализировать члены, используя параметры, иначе члены класса получат значения по умолчанию (а не те, которые были переданы).

Кроме того, если вы хотите аргумент со значением по умолчанию, укажите его в определении класса, а не в определении конструктора. Например;

class Car 
{ 
     public: 

      Car(int, std::string, int = 0); 
}; 

Car::Car(int y, string m, int s) : year(y), make(m), speed(s) 
{ 
} 

Это облегчает задачу, особенно если определение класса находится в файле заголовка.

+0

Спасибо за это полезное объяснение! Похоже, мне нужно передумать пару вещей. Я ценю это! –

Смежные вопросы