使用Catch_amalgamated测试Price类时程序异常退出求助
问题解决:Price类测试的编译警告与无输出问题
一、编译警告:返回局部变量引用
问题原因
operator+函数返回了局部变量sum的引用,局部变量在函数执行完毕后会被销毁,返回引用会触发未定义行为,这正是编译器抛出[-Wreturn-local-addr]警告的原因。
修复方案
修改operator+的返回类型为值而非引用:
- 修改Price类定义(price.hpp):
// 原代码 Price& operator+(const Price& second_price) const; // 修改后 Price operator+(const Price& second_price) const;
- 修改实现(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; }
二、运行测试无输出
核心原因
- 上述
operator+的未定义行为导致程序在测试执行过程中崩溃,Catch2无法正常输出结果; - 测试用例的异常类型不匹配:构造函数抛出
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
相关产品推荐
相关产品推荐

