I've written a class that is meant to keep track of errors and print out error messages if necessary. Right now I'm running it against a tester to determine if it can properly detect errors and print messages, but I'm having trouble with printing a very long string of characters. The code works fine when printing a small string of characters such as "Short Message", but when tested against a large string such as "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" it fails and I'm not sure what I'm doing wrong. Here's my code:
Header
#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);
}
}
Main
#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;
}
There's an error in your assignment operator:
ErrorMessage& ErrorMessage::operator=(const char* errorMessage) {
clear();
message(); // <-- Here!
return *this;
}
I think you meant to write message(errorMessage)
, which sets the stored error message, rather than message()
, which returns the stored error message.
Try changing that and see if that fixes things.