Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Конструктор класса

284
26 мая 2005 года
michael_is_98
587 / / 25.02.2005
Добрый день!
Мне нужно создать базовый класс исключения. Написал

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

Как это сделать, ведь конструктор может быть только один?
488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by michael_is_98
Как это сделать, ведь конструктор может быть только один?

Конструкторов может быть сколько угодно.

284
27 мая 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Mоngооsе
Конструкторов может быть сколько угодно.


А какие у них имена, они что - имеют одно и то же имя, но разное число параметров или разные типы?

1.9K
27 мая 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by michael_is_98
А какие у них имена, они что - имеют одно и то же имя, но разное число параметров или разные типы?


да, имена одни и те же, а количество параметров и их тип разные.

284
28 мая 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by solovey
да, имена одни и те же, а количество параметров и их тип разные.


Спасибо!

284
29 мая 2005 года
michael_is_98
587 / / 25.02.2005
Если конструктор базового класса принимает переменное число параметров (...), то конструктор класса, который создается на основе базового, не сможет передать ему переменное число параметров. Что делать?
10
29 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by michael_is_98
Если конструктор базового класса принимает переменное число параметров (...), то конструктор класса, который создается на основе базового, не сможет передать ему переменное число параметров. Что делать?


1. Сделать конструктор без параметров, а "множество параметров" устанавливать вызовом отдельного метода.

2. Передавать список параметров не в виде переменного числа параметров Си, а в виде указателя/массива/списочного контейнера (смотря что используется).

284
31 мая 2005 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Freeman
1. Сделать конструктор без параметров, а "множество параметров" устанавливать вызовом отдельного метода.

2. Передавать список параметров не в виде переменного числа параметров Си, а в виде указателя/массива/списочного контейнера (смотря что используется).



Переменное число параметров используется для вызова функции sprintf(). Т.е. в базовом классе должен быть конструктор (с переменным числом параметров), формирующий строку по формату, остальные классы наследуют этот конструктор (и передают переменное число параметров).
Что такое списочный контейнер? Аргумент типа va_list?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог