2010-08-12 3 views
1

Мне нужна помощь для отладки этой программы.Отладить эту программу C++

// VirtualFN.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <string> 
#include <iomanip> 

using namespace std; 
enum isautostart { no,yes }; 

class vehicle { 
protected: 
    static int noofvehicles; 
    string vehiclename; 
    long long int price; 
    isautostart autostart; 
public: 
    vehicle():price(0),autostart(no),vehiclename("N/A") 
    { 
     noofvehicles++; 
    } 
    vehicle (vehicle& tempveh){ 
     vehiclename = tempveh.vehiclename; 
     autostart = tempveh.autostart; 
     price = tempveh.price; 
    } 
    virtual void getdataofvehicle(){ 
     string tempcarname; 
     char check[15]; 
     cout<< "\nPlease enter the name of vehicle :"; 
     getline(cin,tempcarname); 
     vehiclename = tempcarname; 
     /*******************************************************/ 

     while(true){ 
     cout<< "Please enter the price of the car :"; cin>>setw(14)>>check; 
     if(atoi(check)){ 
      price = atoi(check); 
      break;} 
     else{ 
      cout<< "you didn't enter the integer number , Try again"<<endl; 
     } 
     } 
     /*******************************************************/ 
     char bools; 
     cout <<"Vehicle has autostart function ? : (y/n)"; cin >> bools; 
     if(bools == 'y'){ 
      autostart = yes; 
     } 
     else { autostart = no; } 
    } 
    virtual void displaycardata() { 
     cout<< "\nName of vehicle is :" << vehiclename; 
     cout<< "\nPrice of the vehicle is : $" <<price; 
     if(autostart){ 
      cout<< "\nThis vehicle is autostart.";} 
     else{ 
      cout<< "\nThis vehicle is not autostart.";} 

    } 
    static void displaynoofcars(){ 
     cout<<"\nNo of cars in warehouse are :" << noofvehicles; 
    } 
}; 

int vehicle::noofvehicles = 0; 

class mercedez : public vehicle { 
    string color; 
public: 
    mercedez(): vehicle() { 
     color = "N/A";} 
    void getdataofvehicle() { 
     vehicle::getdataofvehicle(); 
     cout<<"\nPlease enter the color of the car :"; 
     cin >> color; 
    } 
    void displaycardata(){ 
     vehicle::displaycardata(); 
     cout<<"\nThe color of the car is:" << color; 
    } 
}; 



int main() 
{ 
    vehicle *v1; 
    vehicle *v2; 
    mercedez a; 

    v1 = new vehicle; 
    vehicle::displaynoofcars(); 
    v2 = new mercidez; 
    vehicle::displaynoofcars(); 
    v1->getdataofvehicle(); 
    v1->displaycardata(); 
    v2->getdataofvehicle(); 
    v2->displaycardata(); 

    getch(); 

    return 0; 

} 

теперь, когда наследуется класс Mercedez попытаться выполнить getdataofvehicle транспортного средства по v2-> getdataofvehicle();

функция getdataofvehicle часть базового класса не принимает входной сигнал, просто diaplays «Пожалуйста, введите цену автомобиля:» и переходит непосредственно к: соиЬ < < «Пожалуйста, введите цену автомобиля:»; CIN >> setw (14) >> проверить;

Может кто-нибудь пожалуйста, отлаживать это и скажите мне, почему это происходит

Любая помощь очень ценится

+2

'долго долго ИНТ цены;', ничего себе те 'mercidez' могут быть дорогими O_o – Dmitry

+1

@Carl Норум: это не мое домашнее задание, я учусь C++, так что я могу работать с майей api (я учитель gfx artist) @Dmitry: да, они для меня atleast lol – M3taSpl0it

+0

Небольшое предложение: используйте стиль CML для создания наименований. getDataOfVehicle легче читать, чем getdataofvehicle. –

ответ

3

Проблема, вероятно, здесь:

char bools; 
    cout <<"Vehicle has autostart function ? : (y/n)"; cin >> bools; 
    if(bools == 'y'){ 
     autostart = yes; 
    } 
    else { autostart = no; } 

Чтобы получить эту работу, вам нужно ввести «Y < Введите >», чтобы сделать буферную флеш.

Но код только считывает «Y» из входного потока. Таким образом, поток все еще содержит символ <. Введите >. Таким образом, вы можете вводить данные для первого автомобиля, но когда вы добираетесь до второго автомобиля, все еще остаются данные на std :: cin (<Enter>), который читается с помощью std :: getline(), который читает пустую строку.

Чтобы исправить это сделать его прочитать строку:

cout <<"Vehicle has autostart function ? : (y/n)"; 

    std::string bools; 
    std::getline(std::cin, bools); 

    autostart = ((bools == "y") || (bools == "Y"))? yes : no; 

Я дал вам ключ вы должны сделать некоторые работы самостоятельно (иначе вы ничего не узнаете).

То же правило о < Введите > здесь.

cout<< "Please enter the price of the car :"; cin>>setw(14)>>check; 

PS: Не помещайте 2 заявления на одну строку.

Попытка Somthing так:

cout<< "Please enter the price of the car :"; 

std::string priceData; 
std::getline(std::cin, priceData); 

// Choice 1: (Best) 
price= boost::lexical_cast<long long int>(priceData); 

// Choice 2: (OK) Best if you don't have boost; 
std::stringstream priceStream(priceData); 
priceStream >> price; 

// Choice 3: Only if you must use atoi() use it as a last resort. 
price = atoi(priceData.c_str()); 
+0

вы поймете, что у него проблемы с мошенничеством, если он отправит его с хорошим' std :: ''перед всем и тернарным оператором;) умный. – samandmoore

+0

эта вещь помогла, но теперь она не принимает входные данные: «У автомобиля есть функция автозапуска?: (y/n) ", непосредственно переходит к следующим операциям :( – M3taSpl0it

+0

@ user411102: Обновленный ответ. –

1
v2 = new mercidez; 

должен быть

v2 = new mercedez; 

для начинающих.

+4

Или 'mercedes' .. – Potatoswatter