【发布时间】:2017-07-12 12:44:57
【问题描述】:
我编写了一个类,用于跟踪错误并在必要时打印出错误消息。现在我正在对测试仪运行它以确定它是否可以正确检测错误并打印消息,但是我在打印很长的字符串时遇到了麻烦。该代码在打印诸如“短消息”之类的小字符串时可以正常工作,但是在针对诸如“短消息”之类的大字符串进行测试时 “有些错误信息真的很长很长很长很长很长很长” 《长长长长长长长长长长长长长长长长长长长长长长长 它失败了,我不确定我做错了什么。这是我的代码:
标题
#ifndef SICT_ERRORMESSAGE_H__
#define SICT_ERRORMESSAGE_H__
#include <iostream>
namespace sict {
class ErrorMessage {
char* message_;
public:
ErrorMessage();
ErrorMessage(const char* errorMessage);
ErrorMessage& operator=(const ErrorMessage& em) = delete;
ErrorMessage& operator=(const char* errorMessage);
virtual ~ErrorMessage();
void clear();
bool isClear()const;
void message(const char* value);
const char* message() const;
std::ostream& write(std::ostream& ostr)const;
};
std::ostream& operator<<(std::ostream& os, const ErrorMessage& err);
}
#endif
CPP
#define CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include "ErrorMessage.h"
namespace sict{
ErrorMessage::ErrorMessage() {
message_ = nullptr;
}
ErrorMessage::ErrorMessage(const char* errorMessage) {
message_ = nullptr;
message(errorMessage);
}
ErrorMessage& ErrorMessage::operator=(const char* errorMessage) {
clear();
message();
return *this;
}
ErrorMessage::~ErrorMessage() {
delete [] message_;
}
void ErrorMessage::clear() {
delete [] message_;
message_ = nullptr;
}
bool ErrorMessage::isClear() const {
if(message_ == nullptr) {
return true;
}
else {
return false;
}
}
void ErrorMessage::message(const char* value) {
delete [] message_;
message_ = new char[strlen(value) + 1];
strcpy(message_, value);
}
const char* ErrorMessage::message() const {
return message_;
}
std::ostream& ErrorMessage::write(std::ostream& ostr)const {
if (!isClear()) {
ostr << message_;
}
return ostr;
}
std::ostream& operator<<(std::ostream& os, const ErrorMessage& err) {
return err.write(os);
}
}
主要
#include <iostream>
#include "ErrorMessage.h"
using namespace std;
using namespace sict;
int main() {
ErrorMessage T("Testing Error Message");
ErrorMessage e;
cout << T << endl << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "failed!") << endl;
cout << "===========|\r";
for (int i = 0; i < 10000000; i++) {
if (i % 1000000 == 0) {
cout << "*";
cout.flush();
}
e = "Some error message that is really long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long";
}
cout << '*' << endl;
cout << e << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl;
e.message("Short Message");
cout << e << endl << e.message() << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl;
e.clear();
cout << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "Failed!") << endl;
return 0;
}
【问题讨论】:
-
“失败”是什么意思?
-
我已添加主文件以进行更多说明。
-
它仍然无法解释你对失败的理解。
-
我所说的失败是主文件输出“isClear(): Failed!”而不是“通过!”当它测试极长的字符串并且字符串根本不打印时。另一方面,在处理短消息时,输出为“isClear(): Passed!”并输出字符串。