2017-07-12 7 views
0

J'ai créé une classe destinée à suivre les erreurs et à imprimer des messages d'erreur si nécessaire. À l'heure actuelle, je le lance contre un testeur pour déterminer s'il peut détecter correctement les erreurs et imprimer les messages, mais j'ai de la difficulté à imprimer une très longue chaîne de caractères. Le code fonctionne bien lors de l'impression d'une petite chaîne de caractères tels que "Short Message", mais lorsqu'il est testé contre une grande chaîne comme "Un message d'erreur qui est vraiment long, long, long, long, long" "long long long long long long long long long long long long " il échoue et je ne suis pas sûr de ce que je fais mal. Voici mon code:Problème lors de l'impression de grandes chaînes de caractères C++

tête

#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 

RPC

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

principal

#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

Qu'est-ce que cela veut dire "ça échoue"? – KjMag

+0

J'ai ajouté le fichier principal pour plus de précisions. – Glaz

+0

Il n'explique toujours pas ce que vous comprenez par l'échec. – KjMag

Répondre

1

Il y a une erreur dans votre Affect opérateur nnement:

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

Je pense que vous vouliez écrire message(errorMessage), qui définit le message d'erreur stocké, plutôt que message(), qui retourne le message d'erreur stocké. Essayez de changer cela et voir si cela résout les choses.