Не могу найти ошибку - PullRequest
       0

Не могу найти ошибку

0 голосов
/ 13 декабря 2011

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

#include <iostream>
using namespace std;


class Textbook
{
private:
    char *aPtr;
    char *tPtr;
    int yearPub;
    int numPages;
    char bookType;
public:
    Textbook(char *, char *, int, int, char);
    void display();
    void operator=(Textbook&);
};

 Textbook::Textbook(char*string = NULL, char*string2 = NULL, int ypub = 0, int npages = 0, char btype = 'X')
{
aPtr = new char[strlen(string) +1];
strcpy(aPtr, string);

tPtr = new char[strlen(string2) +1];
strcpy(tPtr, string2);

yearPub = ypub;
numPages = npages;
bookType = btype;
}

void Textbook::display()
{
cout << "The name of the author is: " << *aPtr << endl;
cout << "The Title of the book is: " << *tPtr << endl;
cout << "The year it was published is: " << yearPub << endl;
cout << "The number of pages is: " << numPages << endl;
cout << "The initial of the title is: " << bookType << endl;
return;
}

void Textbook::operator=(Textbook& newbook)
{
if(aPtr != NULL) //check that it exists
    delete(aPtr);// delete if neccessary
aPtr = new char[strlen(newbook.aPtr) + 1];
strcpy(aPtr, newbook.aPtr);

if(tPtr != NULL) //check that it exists
    delete(tPtr); // delete if neccessary
tPtr = new char[strlen(newbook.tPtr) + 1];
strcpy(tPtr, newbook.tPtr);

yearPub = newbook.yearPub;
numPages = newbook.numPages;
bookType = newbook.bookType;
}


void main()
{
Textbook book1("sehwag", "Programming Methods", 2009, 200, 'H');
Textbook book2("Ashwin", "Security Implementation", 2011, 437, 'P');
Textbook book3;

book1.display();
book2.display();
book3.display();

book3 = book1;
book2 = book3;

book1.display();
book2.display();
book3.display();
}

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

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Проблема с параметрами по умолчанию в конструкторе. Вы не можете выполнять такие операции с NULL-указателями.

Textbook book3;

вылетает ваша программа.

1 голос
/ 13 декабря 2011

Изменить:

cout << "The name of the author is: " << *aPtr << endl;
cout << "The Title of the book is: " << *tPtr << endl;

на:

cout << "The name of the author is: " << aPtr << endl;
cout << "The Title of the book is: " << tPtr << endl;

Также изменить:

aPtr = new char[strlen(string) +1];
strcpy(aPtr, string);

на:

if (string != NULL)
{
    aPtr = new char[strlen(string) +1];
    strcpy(aPtr, string);
}
else
{
    aPtr = new char[1];
    aPtr[0] = '\0';
}

и то жедля tptr и string2.

Причина, по которой вам нужна эта проверка, заключается в том, что у вас есть NULL в качестве значения по умолчанию для ваших двух строковых входов, поэтому, когда вы вызываете конструктор без аргументов (как в случаес book3) эти строки являются просто нулевыми указателями.Вызов таких функций, как strlen или strcat с указателем NULL, приведет к исключению, как вы видели.

В идеале вам не следует использовать строки в стиле C с C ++ - вместо этого используйте C ++ string s - это будетпомогите избежать таких проблем, как перечисленные выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...