【问题标题】:Constructors issue构造函数问题
【发布时间】:2012-11-07 19:56:25
【问题描述】:

我必须实现一个类来表示图书馆中的书籍。对于每本书,我必须指定:标题、作者、ISBN 代码、出版年份和价格。然后我需要创建一个包含图书馆中所有书籍的数组。这是我处理过的代码,这是错误:

错误 C2512: 'Book' : 没有合适的默认构造函数可用

我做错了什么?

    Book.h
      #ifndef BOOK_H
      #define BOOK_H

#include<string>

using namespace std;

class Book
{
private:
    string title;
    string author;
    string code; 
    string edit;
    int year;
    double price;
public:
    Book();
    Book(string t, string a, string c, string e, int y, double p)
    {
        title=t;
        author=a;
        code=c;
        edit=e;
        year=y;
        price=p;
    }
    string GetTitle() const { return title;}
    string GetAuthor() const { return author;}
    string GetCode() const {return code;}
    string GetEdit() const {return code;}
    int GetYear() const {return year;}
    double GetPrice() const {return price;}
};
#endif




Library.h
 #ifndef LIBRARY_H
 #define LIBRARY_H
 #include"Book.h"
 #include<iostream>

 class Library
 {
  private:
    Book books[50];
    int index;
   public:
    Library()
    {
        index=0;
    }
    void Add(Book book)
    {
        books[index]=book;
        index++;
    }
    void PrintAll()
    {
        for (int i = 0; i < index; i++)
        {
            Book book=books[i];
            cout<<book.GetTitle()<<":"
    <<book.GetAuthor()<<":"<<book.GetYear()<<endl;
        }
    }
  };
  #endif

   main.cpp


     #include"Library.h"
int main()
{
    Library library;
    Book b1("title1","author1","code1","edit1",1900,34.5);
    library.Add(b1);
    Book b2("title2","author2","code2","edit2",1990,12);
    library.Add(b2);
    library.PrintAll();
}

【问题讨论】:

  • 如果没有默认构造函数,您将无法创建这样的数组。不过,一个向量应该做到这一点,或者一个boost::optional 的数组。您的using namespace std 上还有两个分号,这可能一开始就不应该存在。
  • 库抽象是错误的。当你建立一个图书馆时,你没有 50 本书的数组。一个更好的图书馆应该有一个vector&lt;Book&gt;,当您创建每本书(或购买它们)时,您可以在其中添加书籍。
  • 附注:您的 Add 方法应检查溢出,并且 PrintAll 应在发现空标题时停止。
  • 我是OOP的初学者,还没有学过STL
  • @BoPersson:暗示您可以调整库的大小。如果我们完美地遵循抽象,我们将使用书籍指针数组,并在它们被检出时将它们设置为 null。谢天谢地,我们没有完全遵循抽象:D

标签: c++ visual-c++


【解决方案1】:

现在,由于您已经定义了一个带有 6 个参数的构造函数,编译器不会为您生成默认构造函数。所以你还需要定义一个默认构造函数来支持void Add(Book book) {}等代码行。也许如下:

Book() : title(""), author(""), code(""), edit(""), year(1900), price(0.0) 
{}

【讨论】:

  • 不,没有通用书籍。这只是试图绕过将图书馆作为固定书籍数组的错误抽象。
  • 使用初始化列表本身更好,但字符串已经默认为空,不清楚 1900 和 0.0 是不是特别合理的值。
  • 是的。我选择它们作为默认值的示例。
【解决方案2】:

您的Library 类有一个Book 数组作为其成员。所有成员必须在构造时初始化。由于您没有显式调用Book 构造函数,因此假定默认一个(实际上对于数组,它是唯一可能被调用的一个)。但是Book 没有默认构造函数,因此编译错误。

【讨论】:

  • AFAIK C++11 允许在初始化列表中初始化数组。
  • 没错。该代码显示了已声明但从未定义的默认构造函数。
【解决方案3】:

查看您的代码,您声明了一个(内联)无参数构造函数

Book();

但不定义,编译器找不到。

试试看

Book() {};

-这只是创建了一个什么都不做的无参数构造函数-,这就是你的意思吗?

编辑 - 刚刚看到 wnraman 的回复。这可能更合适,因为无参数构造函数将 Book 初始化为合理的默认值

【讨论】:

    【解决方案4】:

    我假设你的代码中的其他地方有这样的一行

    Book book;
    

    或定义一个书籍数组,或将它与一些 e-g 一起使用。库中的列表类,它需要一个默认构造函数,该构造函数未在您的类中定义。要么定义这样一个默认构造函数(不带参数),要么在其余代码中找到违规的地方......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多