You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Catch_amalgamated测试Price类时程序异常退出求助

问题解决:Price类测试的编译警告与无输出问题

一、编译警告:返回局部变量引用

问题原因

operator+函数返回了局部变量sum的引用,局部变量在函数执行完毕后会被销毁,返回引用会触发未定义行为,这正是编译器抛出[-Wreturn-local-addr]警告的原因。

修复方案

修改operator+的返回类型为值而非引用:

  1. 修改Price类定义(price.hpp):
// 原代码
Price& operator+(const Price& second_price) const;
// 修改后
Price operator+(const Price& second_price) const;
  1. 修改实现(price.cpp):
// 原代码
Price& Price::operator+(const Price& second_price) const
{
    Price sum = *this;
    sum += second_price;
    return sum;
}
// 修改后
Price Price::operator+(const Price& second_price) const
{
    Price sum = *this;
    sum += second_price;
    return sum;
}

二、运行测试无输出

核心原因

  1. 上述operator+的未定义行为导致程序在测试执行过程中崩溃,Catch2无法正常输出结果;
  2. 测试用例的异常类型不匹配:构造函数抛出ZeroPriceException,但测试用CHECK_THROWS_AS期望捕获std::invalid_argument,会导致测试逻辑错误。

修复步骤

1. 修正异常类型匹配

修改测试用例中的异常捕获类型为实际抛出的ZeroPriceException:

// 原测试代码
CHECK_THROWS_AS(Price(0,0), std::invalid_argument);
CHECK_THROWS_AS(Price(-35,20), std::invalid_argument);
// 修改后
CHECK_THROWS_AS(Price(0,0), ZeroPriceException);
CHECK_THROWS_AS(Price(-35,20), ZeroPriceException);

2. 额外优化(可选但推荐)

为getter函数添加const修饰,确保在const对象上也能正常调用:

// 修改price.hpp中的getter声明
int get_before_comma() const;
int get_after_comma() const;

// 修改price.cpp中的实现
int Price::get_before_comma() const
{
    return before_comma;
}

int Price::get_after_comma() const
{
    return after_comma;
}

三、重新编译运行

执行原编译命令重新编译:

g++ -o run_test_price .\test_price.cpp ..\price.cpp .\catch_amalgamated.cpp ..\exceptions\zero_price_exception.cpp

运行测试程序即可看到完整的测试通过/失败报告。

内容的提问来源于stack exchange,提问作者Barbara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:24:59