Как вы используете наборы и получает в C ++? - PullRequest
2 голосов
/ 09 февраля 2010

Я использовал их в 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: основной имеет возврат 0; просто как заполнитель, просто пытающийся понять всю вещь «получи и установи».

Ответы [ 6 ]

4 голосов
/ 09 февраля 2010

Обычно ваши функции get / set должны работать нормально. Некоторые другие комментарии:

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

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

Пример:

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);
1 голос
/ 09 февраля 2010

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

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

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

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

0 голосов
/ 09 февраля 2010

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

  1. Ваши переменные-члены должны быть приватными , а не публичными , так как их открытая оболочка нарушает инкапсуляцию и лишает доступа к ним с помощью функций доступа (получателя / установщика).
  2. Ваши имена функций и параметры функций затмевают имена ваших переменных-членов, что приводит к некоторой путанице. Как и в Java, где вам нужно использовать this.x, чтобы отличить переменную-член "x" от параметра "x", аналогично вам нужно будет использовать this->x. Однако этого можно избежать, если вы всегда задаете переменным-членам какой-то префикс. Два общих соглашения заключаются в том, чтобы префиксировать переменные-члены символом подчеркивания (например, назвать переменную-член _speed и использовать speed в качестве имени параметра) или использовать «m» (для «члена»), за которым следует подчеркивание.
  3. Любая функция, которая не изменяет данные - т. Е. Все ваши функции «получения» - должна быть объявлена ​​с ключевым словом const , чтобы к этим данным можно было получить доступ с const Car или const Car&. Например, используйте int getSpeed()const вместо int getSpeed(), чтобы объявить его постоянным.
0 голосов
/ 09 февраля 2010

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

0 голосов
/ 09 февраля 2010

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

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

...