Como você usa conjuntos e fica em C ++?
Pergunta
Eu usei-os em java e não parecia ter muitos problemas, mas eu não estou agarrando-los muito bem em C ++. A atribuição é:
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.
Até agora, este é o que eu tenho, mas estou razoavelmente certo que estou completamente errado. Se alguém tem algum conselho que eu realmente aprecio isso, obrigado!
#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: O principal tem return 0; puramente como um local reservado apenas tentando entender o todo "get e set" coisa.
Solução
Geralmente seus / funções definidas get deve funcionar bem. Alguns outros comentários:
- O
year
,make
espeed
variáveis ??provavelmente deve ser privada, senão não haveria realmente qualquer necessidade de ter obter funções / SET para eles desde que as variáveis ??poderia muito bem ser alterado diretamente. - Provavelmente não deve haver nenhum set-funções em tudo. Eu não acho que ele está destinado a ser possível mudança do
year
oumake
ou definir ospeed
diretamente. - O construtor deve tomar
newYear
enewMake
como parâmetros. -
accelerate()
ebreak()
deve alterar ospeed
salvos no objeto carro, não apenas retornar um valor diferente despeed
. -
using namespace std;
pode importar lotes de nomes inesperados para o namespace global e muitas vezes é preferível usar nomes explicitamente qualificados comostd::string
vez.
Outras dicas
Alguns problemas que vejo:
Você está se referindo a variáveis ??no construtor que não foram passados ??para o construtor (newYear
, newMake
)
O accelerate
e decelerate
não modificar qualquer estado; eles simplesmente somar e subtrair 5 a partir de uma velocidade que é passado em - Eu não acho que eles deveriam se comportar dessa maneira. Note-se que a descrição do problema diz que eles adicionar / subtrair da speed
variável de membro .
Todas as suas variáveis ??de membro são públicos. Você faria isso em Java?
Você provavelmente vai querer fazer as variáveis ??internas privado, uma vez que só deve ser atualizado por métodos dentro da classe. Em segundo lugar, você precisa de parâmetros para o construtor para que você possa definir o ano e fazer inicialmente.
Ex:
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);
}
...
}
Você também não estão atualizando os valores de velocidade em seus accelerate
e brake
métodos.
Tente:
return (speed -=5);
ou
return (speed += 5);
As funções accelerate()
e brake()
deve operar sobre o membro speed
em vez de apenas retornar o valor modificado. Este significa atribuir a speed
conforme o caso.
Além disso, os membros que têm assessores são normalmente feitas private
ou protected
em vez de ser pública esquerda.
O método getter e Setter é usada para conseguir o encapsulamento de dados, de modo que apenas os membros da classe pode membros de dados única de acesso da classe.
Vários comentários:
- As suas variáveis ??de membro deve ser privada , não público como tornando-breaks públicas encapsulamento e derrota o propósito de acessá-los usando acessor (getter / setter) funções.
- Seus nomes de funções e parâmetros da função de sombra os nomes de suas variáveis ??associadas, que está levando a algumas das confusões. Assim como em Java, onde você precisa usar
this.x
para distinguir a variável de membro "x" do parâmetro "x", da mesma forma que você precisa para usothis->x
. No entanto, isso pode ser evitado se você sempre dar suas variáveis ??de membro de algum tipo de prefixo. Duas convenções comuns são a variáveis ??membro prefixo com um sublinhado (por exemplo, o nome do seu_speed
variável membro e utilizaçãospeed
como o nome de um parâmetro) ou a utilização de um 'm' (para "membro") seguido por um sublinhado. - Qualquer função que não modifica os dados - ou seja, todas as suas funções "getter" - deve ser declarada com a palavra-chave const , de modo que estes dados podem ser acessados ??a partir de um
const Car
ouconst Car&
. Por exemplo, o usoint getSpeed()const
vez deint getSpeed()
declará-la constante.