2015-02-03 7 views
-3

Я не могу понять, почему я получаю значения мусора ... Я не знаю, как заставить это дать мне значения, которые я установил, не разделяя функцию setdetails.Вектор дает значения мусора

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

class Book 
{ 

    int isbn; 
    int price; 

public: 

Book(); 
Book(int isbn,int price){ 

    isbn =0; 
    price = 0; 
} 

void setDetails(int isbn,int price){ 
    this->isbn = isbn; 
    this->price = price; 
} 


int getDetails()const{ 
    return isbn; 
    return price; 
}}; 

void fillvector(vector<Book>& mybook){ 

cout <<"how many books do you want to add ?"<<endl; 
int loop; 
int Isbn; 
int Price; 
cin>> loop; 

for (int i=0; i < loop; i++){ 

    cout<<"ISBN : "; 
    cin>> Isbn; 
    cout<<endl; 
    cout<<"price : "; 
    cin >>Price; 

    Book newbook(Isbn,Price); 
    mybook.push_back(newbook); 
} 

} 
void printvector(vector<Book>& mybook) { 

int size = mybook.size(); 

for (int i = 1; i <size; i++){ 

    cout<< "ISBN : "<< mybook[i].getDetails()<<endl; 


} 

} 

main(){ 
    vector<Book> mybook; 

    fillvector(mybook); 
    printvector(mybook); 

return 0; 
} 
+2

Обратите внимание, что ваш второй 'возврат' в' getDetails' никогда не достигается. – Jarod42

+0

Я считаю, что вы не выделили память для экземпляров книги ... Попробуйте использовать ключевое слово 'new' ... – TheDillo

+1

@ TheDillo, память распределяется соответствующим образом на' Book newbook (Isbn, Price); ' – chris

ответ

3

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

Book(int isbn, int price) { 
    this->isbn = isbn; 
    this->price = price; 
} 

или

Book(int isbn, int price) : 
    isbn(isbn), 
    price(price) 
{ 
} 
+0

Как ни странно, GCC лучше предупреждает, чем Clang здесь с '-Wall -Wextra'. – chris

3

У вас есть разные ошибки. Один из них вызывает код для вывода мусора. См. Исправленную версию с комментариями.

class Book 
{ 

    int isbn; 
    int price; 

public: 

Book(); 
// Arguments are named same as members! 
// This cause members to be uninitialized (i.e. contain garbage) 
Book(int arg_isbn,int arg_price){ 

    isbn =arg_isbn; 
    price = arg_price; 
} 

void setDetails(int arg_isbn,int arg_price){ 
    isbn = arg_isbn; 
    price = arg_price; 
} 

// You cannot return two values this way! Only one at time. 
// So, implement two methods returning each particular detail 
int get_isbn()const{ 
    return isbn; 
} 
int get_price()const{ 
    return price; 
} 
}; 

void fillvector(vector<Book>& mybook){ 

cout <<"how many books do you want to add ?"<<endl; 
int loop; 
int Isbn; 
int Price; 
cin>> loop; 

for (int i=0; i < loop; i++){ 

    cout<<"ISBN : "; 
    cin>> Isbn; 
    cout<<endl; 
    cout<<"price : "; 
    cin >>Price; 

    Book newbook(Isbn,Price); 
    mybook.push_back(newbook); 
} 

} 
void printvector(vector<Book>& mybook) { 

int size = mybook.size(); 
// for loop was starting from 1, this seem not intended 
for (int i = 0; i <size; i++){ 
    cout<< "ISBN : "<< mybook[i].get_isbn() << endl; 
    // Output of price member could be added here 
} 

} 

main(){ 
    vector<Book> mybook; 

    fillvector(mybook); 
    printvector(mybook); 

return 0; 
} 

PS. Некоторые нарушения стиля остаются в силе.

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