如何为外部类的对象实例化内部类的构造函数?

时间:2015-12-31 08:42:29

标签: c++ class

我正在尝试实现一个类,它有另一个类作为成员。

class Book
{
    class Author;
}

在.cpp文件中,我正在实现类作者,如下所示:

class Author
{
    string firstName;
    string lastName;
public:
    // the constructor for the class
    Author(string _firstName, string _lastName)
    {
        firstName = _firstName;
        lastName = _lastName;
    }
}

我想要执行以下操作:在 main 中,当我声明类 Book 的对象时,我希望它实例化类作者的构造函数,来自上面的代码。我想通过将参数传递给 Book 类的构造函数,然后使用它们实例化作者的构造函数来实现这一点,如下所示:

Book::Book(string a, string b)
{
    Book::Author(a, b);
}

但是如果我这样做,如果我有另一个内部类,作为类 Book 的成员,那么,假设 - 4个成员,我将有太多参数用于构造函数图书

所以我的问题是:当我创建主类的对象时,是否有另一种实例化类的构造函数的方法?

另外,如果这些成员是课程,我如何打印该主要类的成员?我试图重载<<内部类的运算符,但我得到错误:“无效使用非静态数据成员。”

1 个答案:

答案 0 :(得分:3)

我认为你在C ++内部类中犯了一个错误。没有内部类只有嵌套类,这是不一样的。

嵌套类是一个类,其定义/声明是在另一个的定义/声明中进行的。但是,这种关系是类型的关系,而不是类的实例。

如果你想拥有一本书的作者,你必须建立一个聚合或类似的作品,如下所示:

class Book {
  class Author {
    string name;
    // How to initialize an author (give him a name)
    Author(string n) : name(n) { }
  };
  string title;
  Author theAuthorOfTheBook;
  // How to initialize a book (giving him a title and setting up an author with a given name)

  public :
  Book(string t,string n) : title(t), theAuthorOfTheBook(n) {}
};

嵌套定义很有趣,因为您可能有其他一些 authoring 概念用于不同目的而与书籍创作无关。这个嵌套定义可以让您轻松地谈论书籍创作(Book::Author)。

我添加了一个字段theAuthorOfTheBook来为Book概念定义属性。这可能需要在Book的构造中初始化(参见ctors定义)。