Как использовать cin >> с инициализированным символом * как NULL - PullRequest
0 голосов
/ 04 января 2019

Я новичок в программировании ООП, и мне нужна помощь с домашней работой. Мне нужно ввести char * с помощью cin >>, но когда я инициализировал char * как NULL, он выходит из строя и выдает мне исключение «_Str was nullptr», что я могу сделать, чтобы решить эту проблему? Я использую класс с защищенными членами, я пытался перейти на общедоступный, но это не помогло. Как я уже сказал, я новичок в этом, поэтому извините, если я не объяснил должным образом.

В приведенном ниже коде «Книга А» работает правильно.

class Book
{
protected:
char* title;
char* firstName;
char* lastName;
char* company;
int pages;
float price;
}

мой параметризованный конструктор выглядит так

Book(const char* title, const char* firstName, const char* lastName, const char* company, int pages, float price)
{
    this->title = new char[strlen(title) + 1];
    strcpy(this->title, title);
    this->fistName = new char[strlen(firstName) + 1];
    strcpy(this->firstName, firstName);
    this->lastName = new char[strlen(lastName) + 1];
    strcpy(this->lastName, lastName);
    this->company = new char[strlen(company) + 1];
    strcpy(this->company, company);
    this->pages = pages;
    this->price = price;
}

int main()
{
Book a("TESTtitle", "TESTfirstName", "TESTlastName", "TESTcompany", 365, 50);
a.print();
Book c;
char* title=NULL;
char* firstName=NULL;
char* lastName=NULL;
char* company=NULL;
int pages;
float price;
cin >> title;
cin >> firstName;
cin >> lastName;
cin >> company;
cin >> pages;
cin >> price;
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы используете std::string почти так же, как вы используете int (но вы должны #include это определение, а не ключевое слово). Также обычно лучше принимать любые std::ostream для вывода, чем всегда std::cout. Обратите внимание, что using namespace std является плохой идеей .

#include <string>
#include <iostream>

struct Book
{
    std::string title;
    std::string firstName;
    std::string lastName;
    std::string company;
    int pages;
    float price;
}

// more idiomatic that "Book::print"
std::ostream& operator << (std::ostream& os, const Book & b)
{
    os << b.title;
    os << b.firstName;
    os << b.lastName;
    os << b.company;
    os << b.pages;
    os << b.price;
    return os;
}

std::istream& operator >> (std::istream& is, Book & b)
{
    is >> b.title;
    is >> b.firstName;
    is >> b.lastName;
    is >> b.company;
    is >> b.pages;
    is >> b.price;
    return is;
}

int main()
{
    Book a { "TESTtitle", "TESTfirstName", "TESTlastName", "TESTcompany", 365, 50 };
    std::cout << a;

    Book c;  
    std::cin >> c;

    std::cout << c;
}
0 голосов
/ 04 января 2019

Поскольку этот вопрос помечен C ++, вам следует подумать дважды об указателях. Программа высокого уровня C ++ должна избегать rawe-указателей: ссылок, умных указателей и стандартных контейнеров должно быть достаточно.

Если вы хотите заглянуть за кулисы, вы должны увидеть указатель в качестве адреса: вы не можете ничего с ним сделать, если он не указывает на действительный объект. Здесь вы инициализировали свои указатели в NULL, поэтому вы не можете разыменовать их. Вы должны назначить им массив допустимых символов перед их использованием

#define SIZE 32
char cTitle[SIZE];
char *title = cTitle;

Но помните: это скорее код C-ish, и вы не должны использовать его, если вам не нужно взаимодействовать с кодом C или создавать пользовательский объект низкого уровня.

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