Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 建设者问题_C++_Visual C++ - Fatal编程技术网

C++ 建设者问题

C++ 建设者问题,c++,visual-c++,C++,Visual C++,我必须实现一个类来表示图书馆中的书籍。对于每一本书,我必须详细说明:书名、作者、ISBN代码、出版年份和价格。然后我需要创建一个包含图书馆中所有书籍的数组。这是我编写的代码,这是错误: 错误C2512:“Book”:没有合适的默认构造函数可用 我做错了什么 Book.h #ifndef BOOK_H #define BOOK_H #include<string> using namespace std; class Book { private:

我必须实现一个类来表示图书馆中的书籍。对于每一本书,我必须详细说明:书名、作者、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();
}
Book.h
#ifndef手册
#定义书
#包括
使用名称空间std;
课堂用书
{
私人:
字符串标题;
字符串作者;
字符串代码;
字符串编辑;
国际年;
双倍价格;
公众:
书();
书本(字符串t、字符串a、字符串c、字符串e、整数y、双p)
{
title=t;
作者=a;
代码=c;
编辑=e;
年份=y;
价格=p;
}
字符串GetTitle()常量{return title;}
字符串GetAuthor()常量{return author;}
字符串GetCode()常量{返回代码;}
字符串GetEdit()常量{返回代码;}
int GetYear()常量{返回年份;}
double GetPrice()常量{返回价格;}
};
#恩迪夫
图书馆
#ifndef图书馆
#定义库
#包括“Book.h”
#包括
类库
{
私人:
图书[50];
整数指数;
公众:
图书馆()
{
指数=0;
}
无效添加(书本)
{
图书[索引]=图书;
索引++;
}
void PrintAll()
{
对于(int i=0;i我想你的代码中还有一行

Book book;

或者定义一个书籍数组,或者将其与一些示例一起使用。列出库中的类,这些类需要默认构造函数,而默认构造函数未在类中定义。或者定义此类默认构造函数(不带参数),或者在代码的其余部分中找到不合适的地方…

我假设您的代码中还有一行

Book book;

或者定义一个书籍数组,或者将其与一些示例一起使用。列出库中的类,这些类需要默认构造函数,而默认构造函数未在类中定义。或者定义此类默认构造函数(不带参数),或在代码的其余部分中找到不合适的位置…

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

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

现在,由于您定义了一个包含6个参数的构造函数,编译器将不会为您生成默认构造函数。因此,您还需要定义一个默认构造函数来支持代码行,例如
void Add(Book){
。可能如下所示:

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

现在,由于您已经定义了一个包含6个参数的构造函数,编译器不会为您生成默认构造函数。因此您还需要定义一个默认构造函数来支持代码行,例如
void Add(Book){}
。可能如下所示:

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

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

Book();
但是不要定义它,因此编译器无法找到它

试试看

Book() {};
-这只是创建了一个不做任何事情的无参数构造函数-,这就是您想要做的吗


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

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

Book();
但是不要定义它,因此编译器无法找到它

试试看

Book() {};
-这只是创建了一个不做任何事情的无参数构造函数-,这就是您想要做的吗


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

如果没有默认构造函数,就无法生成这样的数组。不过,向量应该可以做到这一点,或者是一个
boost::optional
数组。使用命名空间的
上还有两个分号std
,可能一开始就不应该存在。图书馆抽象是错误的。当你建立一个图书馆时,你没有50本书的数组。一个更好的图书馆应该有一个
向量,你可以在创建每本书(或购买)时添加书。两个旁注:你的Add方法应该检查溢出,当它注意到一个空标题时,PrintAll应该停止。我是一个OOP乞丐,我还没有学会STL@BoPersson:这意味着您可以调整库的大小。如果我们完全遵循抽象,我们将使用书籍指针数组,并在检查它们时将其设置为null出局。谢天谢地,我们并没有完全遵循抽象:如果没有默认构造函数,你无法生成那样的数组。不过,向量应该可以做到这一点,或者一个
boost::optional
数组。使用命名空间std
,你的
上还有两个分号,这可能一开始就不应该存在。库abstra这是错误的。当你建立一个图书馆时,你没有一个50本书的数组。一个更好的图书馆应该有一个
向量,当你创建每本书(或购买它们)时,你可以在这里添加书籍。两个旁注:你的Add方法应该检查溢出,当它注意到一个空标题时,PrintAll应该停止。我是一个OOP乞丐,我还没有学会STL@BoPersson:这意味着您可以调整库的大小。如果我们完全遵循抽象,我们将使用