2017-07-12 17 views
0

エラーを追跡し、必要に応じてエラーメッセージを出力するクラスを作成しました。今私はそれがエラーを適切に検出してメッセージを印刷できるかどうかを判断するためにテスターに​​対して実行していますが、非常に長い文字列を印刷するのに問題があります。コードは、 "短いメッセージ"などの小さな文字列を印刷するときにはうまく動作しますが、 などの大きな文字列に対してテストした場合は、「本当に長い長文の長い長文の長文の長さ " "長い長い長い長い長い長い長い長い長い " それは失敗し、私は間違って何をしているのか分からない。ここに私のコードです:大きな文字列を印刷する際のトラブルシューティングC++

ヘッダー

#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); 
} 
} 

あなたassigに誤りがあります

#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; 
} 
+2

「失敗する」とはどういう意味ですか? – KjMag

+0

私は、より明確にするためにメインファイルを追加しました。 – Glaz

+0

それはあなたが失敗によって理解していることをまだ説明していません。 – KjMag

答えて

1

メインnment演算子:

ErrorMessage& ErrorMessage::operator=(const char* errorMessage) { 
    clear(); 
    message(); // <-- Here! 
    return *this; 
} 

私はあなたが格納されたエラーメッセージを返すというよりもmessage()格納されたエラーメッセージを、設定message(errorMessage)を書くためのものだと思います。

これを変更して修正するかどうかを確認してください。

関連する問題