Класс не содержит члена с именем ... в C ++ - PullRequest
0 голосов
/ 28 марта 2020

Предположим, я делаю библиотеку книг на C ++ следующим образом:

#include <iostream>
#include <string>
#include <vector>

class Book
{
public:
     Book(string name, string author)
};

Простой, просто конструктор, теперь я создаю вектор из Book и pu sh книг назад:

int main()
{
   vector<Book> books;
   books.push_back(Book("Gatsby", "Fitzgerald"));

Но когда я пытаюсь распечатать какого-нибудь участника (имя или автора):

   cout << books[0].name << endl;

   return 0;
}

Мой компилятор мальчика злится:

error: ‘__gnu_cxx::__alloc_traits >::value_type {aka class Book}’ has no member named ‘name’
     cout << books[0].name << endl;

Я относительный новичок, такой подход вообще имеет смысл? И если да, то что я сделал не так?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

В классе Book нет участников для сохранения имени и автора. И заданный вами конструктор синтаксически неверен.

При использовании элементов данных publi c это будет выглядеть так:

class Book
{
public:
    // data members
    std::string name;
    std::string author;

    // parameterized constructor
    Book( std::string name, std::string author )
    {
        this->name = name;
        this->author = author;
    }
};

Обратите внимание:

  1. разоблачение элементов данных таким образом нарушает скрытие данных принцип OOP. В идеале члены данных должны быть private, и должны использоваться адекватные методы доступа.
  2. присваивание имени и автора в теле конструктора только для вашего понимания. Если вы уже изучили список инициализатора для конструктора, используйте его.

Вот пример ( live ):

#include <iostream>
#include <string>
#include <vector>

class Book final
{
public:
    // constructor with initializer list
    Book( std::string name_, std::string author_ ) : name{name_}, author{author_} {}

    // accessor methods
    std::string getName() const { return name; }
    std::string getAuthor() const { return author; }

private:
    std::string name;
    std::string author;
};

int main()
{
    std::vector<Book> books;

    books.push_back( Book{"The Alchemist", "Paulo Coehlo"} );
    books.push_back( Book{"Fight Club", "Chuck Palahniuk"} );
    books.push_back( Book{"No Country for Old Men", "Cormac McCarthy"} );

    books.emplace_back( "Brave New World", "Aldous Huxley" );
    books.emplace_back( "1984", "George Orwell" );
    books.emplace_back( "Animal Farm", "George Orwell" );

    for ( const auto& book : books )
    {
        std::cout << book.getName() << " by " << book.getAuthor() << '\n';
    }

    return 0;
}

Some соответствующие темы читать:

0 голосов
/ 28 марта 2020

Компилятор жалуется, что у вас нет члена класса с именем 'name', поэтому вам нужно определить строковое поле publi c в вашем классе 'Book'.

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