我的代码很好,但是有一个突出的例外。
#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++编程手册
ISBN: 1800208987
价格(美元):49.99
期望
标题:现代C++编程手册
ISBN: 1800208987
价格(美元):49.99
标题:现代C++编程手册(电子书)
ISBN: 1800208987
价格(美元):34.99
DRMKey: dkb34x!@*~
格式: Kindle
发布于 2022-11-26 08:41:17
当您调用Book基ctor时:
Book{ title , ISBN , price }您使用未初始化的但基本数据成员title、ISBN等,而不是参数:title_B、ISBN_B等。
因此,应该将基ctor调用更改为:
Book{ title_B , ISBN_B , price_B }此外,为了提高效率(避免复制),您可以通过const &而不是按值接受const &:
//-----------vvvvvvv-----------------vvvvvvv-------------------------------vvvvvvvv
EBook(string const & title_B, string const & ISBN_B, double price_B, string const & DRMKey_B, const string& format_B = "Kindle") : //...附带说明:最好避免using namespace std --参见这里的Why is "using namespace std;" considered bad practice?。
发布于 2022-11-26 09:05:43
当您调用"EBook“的构造函数时,首先尝试初始化基类"Book”。这是正确的。
但是您尝试用自己的、尚未初始化的成员"title“、"ISBN”和"price“初始化它。这些"Book"-class数据成员的值这一次尚未确定。数值未定。
然后作业就不行了。在您的示例中,系统试图分配过多的内存,然后在“新”操作符或std::basic_string构造函数中得到一个异常,当它试图用未初始化的值“构造”字符串数据时。但是,它可以在任何地方发生,因为,正如所说,我们在这里有未定义的行为。
修复很简单:使用"EBook“构造函数中的正确变量来初始化父类的数据成员。
然后,整个更新的代码将如下所示
#include <iostream>
#include <string>
using namespace std::string_literals;
class Book {
public:
Book() {};
std::string title{};
std::string ISBN{};
double price{};
Book(const std::string& title_B, const std::string& ISBN_B, const double price_B) : title{ title_B }, ISBN{ ISBN_B }, price{ price_B } {}
void ShowBookInfo() const {
std::cout << "Title: " << title << "\nISBN: " << ISBN << "\nPrice(USD): " << price << '\n';
}
};
class EBook : public Book {
public:
std::string DRMKey{};
std::string format{};
EBook() : Book() {};
EBook(const std::string& title_B, const std::string& ISBN_B, const double price_B, const std::string& DRMKey_B, const std::string& format_B = "Kindle"s) : Book{ title_B , ISBN_B , price_B }, DRMKey{ DRMKey_B }, format{ format_B } {}
void ShowEBookInfo() const {
ShowBookInfo();
std::cout << "DRMKey: " << DRMKey << "\nFormat: " << format << '\n';
}
};
int main() {
Book book("Modern C++ Programming Cookbook", "1800208987", 49.99);
book.ShowBookInfo();
std::cout << '\n';
EBook ebook("Modern C++ Programming Cookbook(ebook)", "1800208987", 34.99, "dkb34x!@*~");
ebook.ShowEBookInfo();
}https://stackoverflow.com/questions/74580716
复制相似问题