2015-04-27 1 views
3

Я написал программу класса и объекта, и это дает мне некоторые ошибки, которые я не могу обойти. Вот несколько ошибок я не могу обойти, они находятся в main.cpp следующие ошибки ....Класс и объекты на C++ ... Нужны некоторые дополнительные приспособления

Car car1("Ford", "Crown Victoria", 1997); 
    Car car2("Chevrolet", "Camaro"); 
    Car car3("Hyundai", "Sonata", -15); 
126 IntelliSense: no instance of constructor "Car::Car" matches the argument list 
     argument types are: (const char [5], const char [15], int) 

и

car1.SetValue("Flinstones", "Rock Car", -2100); 
    car3.SetValue("Toyota", "Camry", 2005); 


132 IntelliSense: a reference of type "std::string &" (not const-qualified) cannot be initialized with a value of type "const char [6]" 

Вот мой код

// -----------------------Car.h----------------------- 
#include <iostream> 
#include <string> 

class Car{ 
public: 
    Car(string &make, string &model, int year=2015);  // constructor with three parameters 
    string GetMake(); 
    string GetModel(); 
    int GetYear(); 
    int GetSpeed(); 

    bool SetValue(string &make, string &model, int year); // set values from parameters 
    bool Accelerate(char a); 
    bool Brake(char b); 
    void Display();             // displays the output 

private: 
    string automake; 
    string automodel; 
    int autospeed; 
    int autoyear; 
}; 

// -----------------------------Car.cpp--------------------------- 
// The class definition for Car. 
#include <iostream> 
#include "Car.h" 
#include <string> 

using namespace std; 

Car::Car(string &make, string &model, int year) 
{ 
    automake = make; 
    automodel = model; 
    autospeed = 0; 

    if(year < 0) 
     year = 2015; 
    else 
     autoyear = year; 
} 

string Car::GetMake() 
{ 
    return automake; 
} 

string Car::GetModel() 
{ 
    return automodel; 
} 

int Car::GetYear() 
{ 
    return autoyear; 
} 

int Car::GetSpeed() 
{ 
    return autospeed; 
} 

bool Car::SetValue(string &make, string &model, int year) 
{ 
    if(year < 0) 
    { 
     automake = make; 
     automodel = model; 
     autoyear = year; 
     return true; 
    } 
    else 
     return false; 
} 

void Car::Display() 
{ 
    //cout <<"Your car is a " << autoyear << automodel << automake << endl; 
    //cout <<"And it is currently going " << autospeed << " MPH." << endl; 
} 

bool Car::Accelerate(char a) 
{ 
    if((a=='H')||(a=='h')||(a=='M')||(a=='m')||(a=='L')||(a=='l')) 
    { 
     if((a=='H')||(a=='h')) 
      autospeed += 10; 
     if((a=='M')||(a=='m')) 
      autospeed += 5; 
     if((a=='L')||(a=='l')) 
      autospeed += 1; 
     return true; 
    } 
    else 
     return false; 
} 

bool Car::Brake(char b) 
{ 
    if((b=='H')||(b=='h')||(b=='M')||(b=='m')||(b=='L')||(b=='l')) 
    { 
     if((b=='H'||b=='h' && autospeed > 10)) 
      autospeed = 10; 
     if((b=='M'||b=='m' && autospeed > 5)) 
      autospeed = 5; 
     if((b=='L'||b=='l' && autospeed > 1)) 
      autospeed = 1; 
     return true; 
    } 
    else 
     return false; 
} 

// -------------Main.cpp-------------------- 

// Driver routine to test the functions of the Car class 

#include <iostream> 
#include <string> 
#include "Car.h" 
#include "Car.cpp" 

using namespace std; 

int main() 
{ 
    Car car1("Ford", "Crown Victoria", 1997); 
    Car car2("Chevrolet", "Camaro"); 
    Car car3("Hyundai", "Sonata", -15); 

    cout << "\n*** Displaying each car's stats\n"; 
    cout << "Car1:\n"; 
    car1.Display(); 
    cout << "\nCar2:\n"; 
    car2.Display(); 
    cout << "\nCar3:\n"; 
    car3.Display(); 

    cout << "\n*** Accelerating car 3 several times:\n"; 

    car3.Accelerate('h');  // accelerate hard 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 

    car3.Accelerate('M');  // accelerate medium 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 

    car3.Accelerate('L');  // accelerate low 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 

    car3.Accelerate('L');  // accelerate low 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 

    car3.Accelerate('Z');  // accelerate with invalid level 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 

    cout << "\n*** Resetting car make/models\n"; 
    car1.SetValue("Flinstones", "Rock Car", -2100); 
    car3.SetValue("Toyota", "Camry", 2005); 

    cout << "Car1:\n"; 
    car1.Display(); 
    cout << "\nCar3:\n"; 
    car3.Display(); 

    cout << "\n*** Decelerating car3\n"; 
    car3.Brake('m'); 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 
    car3.Brake('L'); 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 
    car3.Brake('l'); 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 
    car3.Brake('M'); 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 
    car3.Brake('A'); 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 
    car3.Brake('H'); 
    cout << "Car3 speed: " << car3.GetSpeed() << '\n'; 

    cout << "\n*** Calling accessors\n"; 
    cout << "Car1:\n"; 
    cout << " Make: " << car1.GetMake() << '\n' 
     << " Model: " << car1.GetModel() << '\n' 
     << " Year: " << car1.GetYear() << '\n'; 

    cout << "Car2:\n"; 
    cout << " Make: " << car2.GetMake() << '\n' 
     << " Model: " << car2.GetModel() << '\n' 
     << " Year: " << car2.GetYear() << '\n'; 

    cout << "Car1:\n"; 
    cout << " Make: " << car3.GetMake() << '\n' 
     << " Model: " << car3.GetModel() << '\n' 
     << " Year: " << car3.GetYear() << '\n'; 

} 
+0

«Ford», «Crown Victoria» являются массивами const char, преобразуют их в строку перед передачей конструктору – Wajahat

+0

@Wajahat 'std: string' может быть неявно построено из' const char * '. – juanchopanza

+0

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

ответ

0

Как говорит ошибка, вам необходимо предоставить конструктор для const ссылок:

Car(const string &make, const string &model, int year=2015);  
0

Вы можете решить эту проблему путем передачи аргументов по значению, а не по ссылке:

Car(string make, string model, int year=2015);  // constructor 
bool SetValue(string make, string model, int year); 

Это позволит автоматически триггером конструктор std::string, который принимает в качестве входных const char *.

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


Кроме того, в C++ инициализация члена в конструкторе должна быть предпочтительно выполнена следующим образом (initializer list):

Car::Car(string make, string model, int year) 
    : automake(make), automodel(model), autospeed(0), autoyear(year < 0 ? 2015 : year) 
{ 
//If the above autoyear code is not clear, you can perfectly 
//keep your code for it, which was just fine 
} 

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

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