2015-09-15 3 views
-2

Привет, я новичок здесь, так извините, если я сделал какие-либо формальные ошибки.Ошибка отладки - выражение: _CrtlsValidHeapPointer (block)

У меня проблема с моей библиотечной программой, которая имеет два класса: Book and Person. Ошибка появилась после того, как я написал _customer = customer; в Книжном конструировании.

Как мне интерпретировать ошибку? Что я делаю не так?

Person класс

class Person{ 

private: 
    char* _name; 
    int _id; 
    static int personCounter; 

public: 
    void setName(char* name); 
    void setId(int id); 
    char* getName(); 
    char* getName() const; 
    int getId(); 
    int getId()const; 
    void showData(); 
    Person(); 
    Person(int id, char* name); 
    Person(const Person &tempPerson); 
    ~Person(); 

}; 

Person конструктор копирования

Person::Person(const Person &tempPerson) { 
    _id = tempPerson.getId(); 
    _name = new char[strlen(tempPerson.getName())]; 
    strcpy(_name, tempPerson.getName()); 
    personCounter--; 
} 

класс Книга

class Book{ 

private: 
    char* _title; 
    char* _author; 
    char* _genre; 
    bool _borrowed; 
    Person _customer; 
    static int counter; 

public: 
    void setTitle(char* title); 
    void setAuthor(char* author); 
    void setGenre(char* genre); 
    void setStatus(bool borrowed); 
    void setPerson(Person customer); 

    char* getTitle(); 
    char* getAuthor(); 
    char* getGenre(); 
    bool getStatus(); 
    Person getPerson(); 
    void showData(); 

    Book(); 
    Book(char* title, char* author, char* genre, bool borrowed, const Person &customer); 

    ~Book(); 

}; 

книги Конструктор

Book::Book(char* title, char* author, char* genre, bool borrowed,const Person &customer){ 
    counter++; 



    _title = new char[strlen(title) + 1]; 
    strcpy(_title,title); 

    _author = new char[strlen(author) + 1]; 
    strcpy(_author, author); 

    _genre = new char[strlen(genre) + 1]; 
    strcpy(_genre, genre); 

    _borrowed = borrowed; 

    _customer = customer; 

} 
+3

Это не время компиляции, а ошибка времени выполнения. Утверждения используются для указания некоторых из необходимых условий для вызова этой функции. Используйте ваш отладчик, чтобы проверить, какие параметры вы фактически использовали для его вызова. –

+2

Вы забыли +1 на strlen в конструкторе Person Person. Вот почему люди используют строковые классы в C++, а не в указателях raw char. – antlersoft

+0

Также я настоятельно рекомендую не управлять динамическим распределением памяти самостоятельно. Вместо этого используйте стандартные классы контейнеров или [умные указатели] (http://en.cppreference.com/w/cpp/memory). –

ответ

0

Решил. У меня не было функции переопределения для оператора «=».

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