Мне нужно создать несколько классов (более 50) из базового класса, где единственная разница заключается в именах производных классов.
Например, мой базовый класс определяется как:
class BaseError : public std::exception
{
private:
int osErrorCode;
const std::string errorMsg;
public:
int ec;
BaseError () : std::exception(), errorMsg() {}
BaseError (int errorCode, int osErrCode, const std::string& msg)
: std::exception(), errorMsg(msg)
{
ec = errorCode;
osErrorCode = osErrCode;
}
BaseError (const BaseError& other)
: std::exception(other), errorMsg(other.errorMsg)
{
ec = other.errorCode;
osErrorCode = other.osErrorCode;
}
const std::string& errorMessage() const { return errorMsg; }
virtual ~BaseError() throw(){}
}
Мне нужно создать множество производных классов от этого базового класса, каждый из которых имеет свои собственные конструкторы, конструктор копирования и функцию виртуального деструктора, в настоящее время я копирую/вставляю код, меняя имена там, где это необходимо:
class FileError : public BaseError{
private:
const std::string error_msg;
public:
FileError () :BaseError(), error_msg() {}
FileError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
virtual ~FileError() throw(){}
};
Вопрос. Есть ли способ создать эти классы с использованием шаблонов, чтобы реализация не повторялась?
const std::string& errorMessage() const
, вы можете переопределить виртуальную функциюconst char *std::exception::what() const
, которую вы получаете, наследуяstd::exception
. - person Frerich Raabe   schedule 13.12.2010typedef
недостаточно? Насколько я вижу, в производных классах нет ничего полезного. - person Naveen   schedule 13.12.2010std::string errorMsg;
в вашем базовом классе вместо одного в базовом классе, а затем по одному на производный класс. Это немного более эффективно (с точки зрения памяти и скорости выполнения). Вы можете установить строковую переменную-член, предоставив (защищенный) метод установки или передав аргумент конструктору базового класса. - person Frerich Raabe   schedule 13.12.2010