C++ 建设者问题
我必须实现一个类来表示图书馆中的书籍。对于每一本书,我必须详细说明:书名、作者、ISBN代码、出版年份和价格。然后我需要创建一个包含图书馆中所有书籍的数组。这是我编写的代码,这是错误: 错误C2512:“Book”:没有合适的默认构造函数可用 我做错了什么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:
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:这意味着您可以调整库的大小。如果我们完全遵循抽象,我们将使用