Как я могу получить тот же код метода в подклассе без дублирования кода?

У меня есть следующий код:

#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.
Это именно то, чего я хочу, но я хотел бы избежать очевидного дублирования кода и, похоже, не могу найти (и элегантный) способ сделать это.

Было бы очень приятно, если бы кто-то мог помочь мне здесь. 🙂

С наилучшими пожеланиями,
Лило

0

Решение

Реализуйте это через общий класс. Я бы переписал ваш код так:

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 ++ иш. Я также добавил бы, что вставка виртуальной функции не имеет никакого смысла.

1

Другие решения

Спасибо за вашу помощь. Это вдохновило меня. С некоторыми дополнительными идеями одноклассника я придумал это решение, которое прекрасно работает. 🙂

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

Я смотрел на проблему не с той стороны: сверху вниз, а не снизу вверх. ^^

В любом случае спасибо за вашу помощь и с наилучшими пожеланиями,
Лило

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector