【问题标题】:Class contains no member named ... in C++类在 C++ 中不包含名为 ... 的成员
【发布时间】:2020-03-28 15:55:21
【问题描述】:

假设我以这种方式用 C++ 制作图书库:

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

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

简单,只是一个构造函数,现在我创建一个Book的向量并将书籍推回:

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;

我是一个相对初学者,这种方法是否有意义?如果是这样,我做错了什么?

谢谢!

【问题讨论】:

  • 你的类Book 没有任何成员变量。您的构造函数获取了两个参数,但您没有对它们做任何事情,它们只是丢失了。

标签: c++ class vector


【解决方案1】:

Book 类没有成员来存储姓名和作者。而且,您定义的构造函数在语法上是错误的。

对于公共数据成员,它看起来像这样:

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. 构造函数主体中的name 和author 赋值仅供您理解。如果您已经研究过构造函数的初始化列表,请使用它。

这是一个示例 (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;
}

需要阅读的一些相关主题:

【讨论】:

  • 哦,那么基本上在构造函数中发生了什么,留在构造函数中,您需要在结构或类本身中声明这些成员吗?
  • @PierreRigondeaux:是的。类对象需要有一些内存来存储它以后需要使用的数据。 ctor 中的参数仅限于该 ctor 的主体。
  • 还有一件事,有没有写this-&gt;member = member的替代方法; ?
  • @PierreRigondeaux:您可以为数据成员和 ctor/方法参数使用不同的名称,例如name = name_; 那么你不必使用this 指针。
猜你喜欢
  • 2016-06-28
  • 2014-04-24
  • 1970-01-01
  • 2011-02-11
  • 2011-04-12
  • 1970-01-01
  • 2014-06-19
  • 2014-03-24
  • 2014-05-25
相关资源
最近更新 更多