c++ 如何解决未处理的异常错误?

tjrkku2a  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(225)

我的程式码没有问题,但是有一个未解决的例外状况。

#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

v8wbuo2f

v8wbuo2f1#

当你调用“电子书”的构造函数时,你首先尝试初始化你的基类“书”。这是正确的。
但是您尝试用它自己的、尚未初始化的成员“title”、“ISBN”和“price”来初始化它。那些“Book”类数据成员的值是a,这次还没有确定。这些值是未确定的。
然后赋值就不起作用了。在你的例子中,系统试图分配太多的内存,然后当它试图用未初始化的值“构造”字符串数据时,你会在“new”运算符或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();
}
q43xntqr

q43xntqr2#

调用Book基向量时:

Book{ title , ISBN , price }

使用未初始化但基本数据成员titleISBN等,而不是参数:title_BISBN_B等等。
因此,您应该将基本ctor调用更改为:

Book{ title_B , ISBN_B , price_B }

同样为了提高效率(避免复制),可以接受std::string s by const &而不是by value:

//-----------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?

相关问题