简体   繁体   中英

Trouble Printing Larger Character Strings C++

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM