Вопрос

Я использовал их в java, и, похоже, у меня не было слишком много проблем, но я не очень хорошо разбираюсь в них в C ++.Задание заключается в следующем:

Write a class named Car that has the following member variables:

    year. An int that holds the car's model year.
    make. A string that holds the make of the car.
    speed. An int that holds the car's current speed.

In addition, the class should have the following member functions.

    Constructor.  The constructor should accept the car's year and make 
        as arguments and assign these values to the object's year and 
        make member variables.  The constructor should initialize the 
        speed member variable to 0.

    Accessors.  Appropriate accessor functions should be created to allow 
        values to be retrieved from an object's year, make, and speed 
        member variables.

    accelerate.  The accelerate function should add 5 to the speed member 
        variable each time it is called.

    brake.  The brake function should subtract 5 from the speed member 
        variable each time it is called.

Demonstrate the class in a program that creates a Car object, and then 
    calls the accelerate function five times.  After each call to the 
    accelerate function, get the current speed of the car and display 
    it.  Then, call the brake function five times.  After each call to 
    the brake function, get the current speed of the car and display it.

Пока это то, что у меня есть, но я вполне уверен, что совершенно не прав.Если у кого-нибудь есть какой-нибудь совет, я был бы очень признателен, спасибо!

#include<iostream>
#include<string>

using namespace std;

class Car
{
    public:
        int year;
        string make;
        int speed;
    Car()
    {
        setYear(newYear);
        setMake(newMake);
        setSpeed(0);
    }

    void setYear(int newYear)
    {
        year = newYear;
    }
    void setMake(string newMake)
    {
        make = newMake;
    }
    int getYear()
    {
        return year;
    }
    string getMake()
    {
        return make;
    }
    int accelerate(int speed)
    {
        return (speed+5);
    }
    int brake(int speed)
    {
        return (speed-5);
    }
};

int main()
{
    return 0;
}

PS:Основной имеет значение return 0;исключительно как владелец места, просто пытающийся понять всю эту штуку с "получением и установкой".

Это было полезно?

Решение

Как правило, ваши функции получения / установки должны работать нормально.Некоторые другие комментарии:

  • Тот Самый year, make и speed переменные, вероятно, должны быть закрытыми, иначе на самом деле не было бы никакой необходимости иметь для них функции get / set, поскольку переменные также можно изменять напрямую.
  • Вероятно, вообще не должно быть никаких set-функций.Я не думаю, что предполагается, что это возможно изменить year или make или установите speed напрямую.
  • Конструктор должен принимать newYear и newMake в качестве параметров.
  • accelerate() и break() следует изменить speed сохраняется в объекте car, а не просто возвращает значение, отличное от speed.
  • using namespace std; может импортировать множество неожиданных имен в глобальное пространство имен, и часто предпочтительнее использовать явно определенные имена, такие как std::string вместо этого.

Другие советы

Некоторые проблемы я вижу:

Вы имеете в виду переменные в конструкторе, которые не были переданы конструктору (newYear, newMake)

А accelerate и decelerate функции не изменяют никакого состояния;они просто добавляют и вычитают 5 из переданной скорости - я не думаю, что они должны вести себя таким образом.Обратите внимание, что в описании проблемы сказано, что они прибавляют/вычитают из speed переменная-член.

Все ваши переменные-члены являются общедоступными.Вы бы сделали это на Java?

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

Бывший:

public: Car(int newYear, string newMake) {...}

class Car
{
private:
        int year;
        string make;
        int speed;
public:
    Car(int newYear, string newMake)
    {
        setYear(newYear);
        setMake(newMake);
        setSpeed(0);
    }
    ...
}

Вы также не обновляете значения скорости на своем accelerate и brake методы.Пытаться:

return (speed -=5);

или

return (speed += 5);

А accelerate() и brake() функции должны работать на основе speed член вместо того, чтобы просто возвращать измененное значение.Это означает присвоение speed по мере необходимости.

Кроме того, члены, имеющие средства доступа, обычно создаются private или protected вместо того, чтобы оставаться публичным.

Методы получения и установки используются для достижения инкапсуляции данных, поэтому только члены класса могут получать доступ только к членам класса.

Несколько комментариев:

  1. Ваши переменные-члены должны быть Частное, не публичный поскольку предоставление им общедоступности нарушает инкапсуляцию и сводит на нет цель доступа к ним с использованием функций доступа (getter / setter).
  2. Имена ваших функций и их параметры затмевают имена ваших переменных-членов, что приводит к некоторой путанице.Так же, как и в Java, где вам нужно использовать this.x чтобы отличить переменную-член "x" от параметра "x", аналогично вам нужно было бы использовать this->x.Однако этого можно избежать, если вы всегда присваиваете своим переменным-членам какой-то префикс.Два распространенных соглашения заключаются в том, чтобы префиксить переменные -члены знаком подчеркивания (напримерназовите свою переменную-член _speed и использовать speed в качестве имени параметра) или использовать букву "m" (для обозначения "члена"), за которой следует символ подчеркивания.
  3. Любая функция, которая не изменяет данные, т.е. все ваши функции "получения", должна быть объявлена с ключевым словом постоянный, чтобы к этим данным можно было получить доступ из const Car или const Car&.Например, используйте int getSpeed()const вместо того, чтобы int getSpeed() чтобы объявить его постоянным.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top