我的程式码没有问题,但是有一个未解决的例外状况。
#include <iostream>
using namespace std;
class Book {
public:
string title;
string ISBN;
double price;
Book(string title_B, string ISBN_B, double price_B ) : title{title_B}, ISBN{ISBN_B}, price{price_B} {}
void ShowBookInfo() {
cout << "Title: " << title << endl;
cout << "ISBN: " << ISBN << endl;
cout << "Price(USD): " << price << endl;
}
};
class EBook : public Book {
public:
string DRMKey;
string format;
EBook(string title_B, string ISBN_B, double price_B, string DRMKey_B, const string& format_B = "Kindle") : Book{ title , ISBN , price }, DRMKey{ DRMKey_B }, format{ format_B } {}
void ShowEBookInfo() {
cout << "Title: " << title << endl;
cout << "ISBN: " << ISBN << endl;
cout << "Price(USD): " << price << endl;
cout << "DRMKey: " << DRMKey << endl;
cout << "Format: " << format << endl;
}
};
int main() {
Book book("Modern C++ Programming Cookbook", "1800208987", 49.99);
book.ShowBookInfo();
cout << endl;
EBook ebook("Modern C++ Programming Cookbook(ebook)", "1800208987", 34.99, "dkb34x!@*~");
ebook.ShowEBookInfo();
return 0;
}
使用F10快捷键逐行执行代码时,如果“EBookbook(~~);“位置,有什么问题?
输出
标题:现代C++编程指南
国际标准书号:1800208987
价格(美元):49.99
预期
标题:现代C编程指南
国际标准书号:1800208987
价格(美元):49.99
标题:现代C编程手册(电子书)
国际标准书号:1800208987
价格(美元):34.99
DRM密钥:dkb 34 x!@*~
格式:Kindle
2条答案
按热度按时间v8wbuo2f1#
当你调用“电子书”的构造函数时,你首先尝试初始化你的基类“书”。这是正确的。
但是您尝试用它自己的、尚未初始化的成员“title”、“ISBN”和“price”来初始化它。那些“Book”类数据成员的值是a,这次还没有确定。这些值是未确定的。
然后赋值就不起作用了。在你的例子中,系统试图分配太多的内存,然后当它试图用未初始化的值“构造”字符串数据时,你会在“new”运算符或
std::basic_string
构造函数中得到一个异常。但是,它可能在任何地方发生,因为正如前面所说,我们在这里有未定义的行为。解决方法很简单:使用“EBook”构造函数中的正确变量初始化父类的数据成员。
整个更新后的代码将如下所示
q43xntqr2#
调用
Book
基向量时:使用未初始化但基本数据成员
title
、ISBN
等,而不是参数:title_B
、ISBN_B
等等。因此,您应该将基本ctor调用更改为:
同样为了提高效率(避免复制),可以接受
std::string
s byconst &
而不是by value:旁注:最好避免
using namespace std
-请参阅此处的Why is "using namespace std;" considered bad practice?。