首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决未处理的异常错误?

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

Stack Overflow用户
提问于 2022-11-26 08:24:23
回答 2查看 62关注 0票数 0

我的代码很好,但是有一个突出的例外。

代码语言:javascript
复制
#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

EN

回答 2

Stack Overflow用户

发布于 2022-11-26 08:41:17

当您调用Book基ctor时:

代码语言:javascript
复制
Book{ title , ISBN , price }

您使用未初始化的基本数据成员titleISBN等,而不是参数:title_BISBN_B等。

因此,应该将基ctor调用更改为:

代码语言:javascript
复制
Book{ title_B , ISBN_B , price_B }

此外,为了提高效率(避免复制),您可以通过const &而不是按值接受const &

代码语言:javascript
复制
//-----------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?

票数 0
EN

Stack Overflow用户

发布于 2022-11-26 09:05:43

当您调用"EBook“的构造函数时,首先尝试初始化基类"Book”。这是正确的。

但是您尝试用自己的、尚未初始化的成员"title“、"ISBN”和"price“初始化它。这些"Book"-class数据成员的值这一次尚未确定。数值未定。

然后作业就不行了。在您的示例中,系统试图分配过多的内存,然后在“新”操作符或std::basic_string构造函数中得到一个异常,当它试图用未初始化的值“构造”字符串数据时。但是,它可以在任何地方发生,因为,正如所说,我们在这里有未定义的行为。

修复很简单:使用"EBook“构造函数中的正确变量来初始化父类的数据成员。

然后,整个更新的代码将如下所示

代码语言:javascript
复制
#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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74580716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档