Конструктор класса
Мне нужно создать базовый класс исключения. Написал
class Exception
{
private:
char* fmessage;
public:
Exception(const char*);
~Exception();
char* getmessage(void);
};
//Методы и конструктор
Exception::Exception(const char *mes)
{
fmessage=(char*)malloc(strlen(mes)+1);
strcpy(fmessage, mes);
}
Exception::~Exception()
{
free(fmessage);
}
char *Exception::getmessage(void)
{
return fmessage;
}
Далее этот класс используется для создания других классов исключения, например
class EParserError: public Exception
{
public:
EParserError(const char *mes):Exception(mes) {}
// деструкторы не наследуются
};
Проблема в том, что я хочу сделать несколько конструкторов в базовом классе Exception. Один - уже есть (ему передается строка - сообщение об ошибке), а вот второй должен работать по аналогии с функцией sprintf: принимать параметр1 - строка(с форматированием), и еще несколько параметров - они в итоге подставляются в строку параметр1 с помощью функции sprintf.
Т.е.
Exception::Exception(const char *mes,...)
{
char *buffer[100];
sprintf(buffer,mes,<все остальные параметры>);
fmessage=(char*)malloc(strlen(buffer)+1);
strcpy(fmessage, buffer);
}
Как это сделать, ведь конструктор может быть только один?
Как это сделать, ведь конструктор может быть только один?
Конструкторов может быть сколько угодно.
Конструкторов может быть сколько угодно.
А какие у них имена, они что - имеют одно и то же имя, но разное число параметров или разные типы?
А какие у них имена, они что - имеют одно и то же имя, но разное число параметров или разные типы?
да, имена одни и те же, а количество параметров и их тип разные.
да, имена одни и те же, а количество параметров и их тип разные.
Спасибо!
Если конструктор базового класса принимает переменное число параметров (...), то конструктор класса, который создается на основе базового, не сможет передать ему переменное число параметров. Что делать?
1. Сделать конструктор без параметров, а "множество параметров" устанавливать вызовом отдельного метода.
2. Передавать список параметров не в виде переменного числа параметров Си, а в виде указателя/массива/списочного контейнера (смотря что используется).
1. Сделать конструктор без параметров, а "множество параметров" устанавливать вызовом отдельного метода.
2. Передавать список параметров не в виде переменного числа параметров Си, а в виде указателя/массива/списочного контейнера (смотря что используется).
Переменное число параметров используется для вызова функции sprintf(). Т.е. в базовом классе должен быть конструктор (с переменным числом параметров), формирующий строку по формату, остальные классы наследуют этот конструктор (и передают переменное число параметров).
Что такое списочный контейнер? Аргумент типа va_list?