У меня есть следующий код:
#include <exception>
class Exception : public std::exception {
private:
const char* MESSAGE = "Exception"
public:
inline virtual const char* what() const throw() {
return this->MESSAGE;
}
};
class ShoulderROMException : public Exception {
private:
typedef Exception super;
const char* MESSAGE = "ShoulderROM exception";
protected:
static const int MAX_MESSAGE_LENGTH = 200;
mutable char composedMessage[ShoulderROMException::MAX_MESSAGE_LENGTH];
public:
virtual const char* what() const throw() {
strcpy(this->composedMessage, super::what());
strcat(this->composedMessage, " -> ");
strcat(this->composedMessage, this->MESSAGE);
return this->composedMessage;
}
};
class KinectInitFailedException : public ShoulderROMException {
private:
typedef ShoulderROMException super;
const char* MESSAGE = "Kinect initialization failed."
public:
virtual const char* what() const throw() {
strcpy(this->composedMessage, super::what());
strcat(this->composedMessage, " -> ");
strcat(this->composedMessage, this->MESSAGE);
return this->composedMessage;
}
};
Это производит записи журнала, выглядящие следующим образом:
Exception -> ShoulderROM exception -> Kinect initialization failed.
Это именно то, чего я хочу, но я хотел бы избежать очевидного дублирования кода и, похоже, не могу найти (и элегантный) способ сделать это.
Было бы очень приятно, если бы кто-то мог помочь мне здесь. 🙂
С наилучшими пожеланиями,
Лило
Реализуйте это через общий класс. Я бы переписал ваш код так:
class Exception : public std::exception {
static const char* MESSAGE = "Exception"static const int MAX_MESSAGE_LENGTH = 200;
mutable char composedMessage[MAX_MESSAGE_LENGTH];
public:
virtual const char* name() const throw() {
return MESSAGE;
}
virtual const char* what() const throw() {
strcpy(this->composedMessage, name());
strcat(this->composedMessage, " -> ");
strcat(this->composedMessage, this->MESSAGE);
return this->composedMessage;
}
};
class ShoulderROMException : public Exception {
static const char* MESSAGE = "ShoulderROM exception";
public:
virtual const char* name() const throw() {
return MESSAGE;
}
};
class KinectInitFailedException : public ShoulderROMException {
static const char* MESSAGE = "Kinect initialization failed."public:
virtual const char* name() const throw() {
return MESSAGE;
}
};
Если вы не хотите так много реализации в Exception
класс, добавить еще один, из которого оба ShoulderROMException
а также KinectInitFailedException
будет наследовать.
Есть другие проблемы с вашим кодом: MESSAGE
участники должны быть static
и твой способ разбираться со строками не очень C ++ иш. Я также добавил бы, что вставка виртуальной функции не имеет никакого смысла.
Спасибо за вашу помощь. Это вдохновило меня. С некоторыми дополнительными идеями одноклассника я придумал это решение, которое прекрасно работает. 🙂
#include <exception>
class Exception :
public std::exception {
private:
static const std::string MESSAGE = "Exception";
protected:
std::string composedMessage;
public:
Exception() :
composedMessage(this->MESSAGE) {
}
virtual const char* what() const throw() {
return this->composedMessage.c_str();
}
};
class ShoulderROMException :
public Exception {
private:
static const std::string MESSAGE = "ShoulderROM exception";
public:
ShoulderROMException() {
this->appendMessage(this->MESSAGE);
}
virtual void appendMessage(std::string message) {
this->composedMessage += " -> ";
this->composedMessage += message;
}
};
class KinectInitFailedException :
public ShoulderROMException {
private:
static const std::string MESSAGE = "Kinect initialization failed.";
public:
KinectInitFailedException() {
this->appendMessage(this->MESSAGE);
}
};
Я смотрел на проблему не с той стороны: сверху вниз, а не снизу вверх. ^^
В любом случае спасибо за вашу помощь и с наилучшими пожеланиями,
Лило