Форум программистов, компьютерный форум CyberForum.ru

Конструктор базового класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Заменитье буквы "a" и "o" в слове на "A" и "O". http://www.cyberforum.ru/cpp-beginners/thread399320.html
Заменитье буквы "a" и "o" в слове на "A" и "O".
C++ Подскажите в чем проблема Даны три слова. Напечатать их общие буквы.C++ #include <iostream> #include <iostream> #include <string> using namespace std; int main() { string s1,s2,s3,s; string v=""; http://www.cyberforum.ru/cpp-beginners/thread399319.html
C++ Определитье количество согластных в слове.
Определитье количество согластных в слове.
C++ Hайти вторую производную функции, зная f(x)=x^4-cos^2(x), по определению( =0,1) в точках c и d.
Hайти вторую производную функции, зная f(x)=x^4-cos^2(x), по определению( =0,1) в точках c и d.
C++ Тип для хранения огромного числа. http://www.cyberforum.ru/cpp-beginners/thread399309.html
Нужно хранить огромное число целого типа.Что-то около 17-24 цифр. Подойдёт ли int 64?
C++ Найти функцию с точностью e , т.е. пока |fn+1-fn| < e . 3) Найти функцию с точностью e , т.е. пока |fn+1-fn| < e . Определить необходимое число членов ряда. Определить абсолютную разность между табличной функцией и суммой ряда. Определить с какой точностью в машине определяется эта функция. cos(x) = 1 - x2/2! + x4/4! ... подробнее

Показать сообщение отдельно
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
05.12.2011, 18:20  [ТС]     Конструктор базового класса
Цитата Сообщение от fasked Посмотреть сообщение
Передавать по константной ссылке, а не значению.
А что это даёт? Я же не всю строку передаю, а только два указателя: id и type, завёрнутые в структуру. Если передавать по константной ссылке, то будет передаваться 1 указатель (замаскированный под ссылку). Я думал это не существенно.

Цитата Сообщение от fasked Посмотреть сообщение
Вызывать конструктор базового класса.
Ну это понятно, но пробема в том, что конструктор базового класса вызывается всегда до вызова конструктора дочернего, а если нужно сделать некоторые вычисления и в зависимости от их результатов вызывать конструктор базового класса с разными параметрами или даже разные перегруженные конструкторы, но при записи типа "DerivedConstructor(bla-bla-bla):ParentConstructor(bla-bla) {}" я не имею возможности производить вычисления до вызова базового конструктора. Например в Delphi базовый конструктор не вызывается сразу, а явно в конструкторе дочернего класса с использованием ключевого слова "inherited", котя конечно это может вызывать ошибки связанные с тем, что конструктор базового класса может быть не вызван вообще. Но в принципе проблема решается тем, что можно определить конструктор базового класса без параметров (как некоторая временная "заглушка"), который будет устанавливать некоторый флаг внутри объекта, что объект ещё не готов к использованию, и потом явно вызывать конструктор базового класса с уже вычисленными параметрами, но это не очень красиво.

Цитата Сообщение от fasked Посмотреть сообщение
Где сам класс?
Вот он:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//Передаётся по указателю функции обработки ошибки, 
//если в главном модуле задан адрес такой функции,
//а если нет, то генерируется исключение с типом этого класса
class ErrorData
{
 
public:
 
    struct ErrorCod
    {
        char* id;
        char* type;
    };
 
private:
 
    ErrorCod errorCod;//Код ошибки
    u1 counter;//Счётчик ошибок
    bool isFatalError;//Флаг фатальности ошибки
 
public:
    
    ErrorData(ErrorCod cod, bool isFatal);
    virtual ~ErrorData();
    virtual wchar_t* getDescription()=0;//Выдаёт описание ошибки
    void incCounter();//Увеличивает счётчик числа ошибок, если они повторяются
    u1 getCounter();//Получение значения счётчика
    ErrorCod getCod();//Считывание кода ошибки
    bool getIsFatal();//Фатальна ли ошибка
    void setIsFatal(bool isFatal);//Задание фатальности ошибки
    
};
примечание: u1 значит тип unsigned длиной 1 байт
Вот конструктор:
C++
1
2
3
4
5
6
ErrorData::ErrorData(ErrorCod cod, bool isFatal)
{
    counter=0;
    errorCod=cod;
    isFatalError=isFatal;
}
Вот один из дочерних класов:
C++
1
2
3
4
5
6
7
8
9
10
11
//id=TIME
class TimeErrorData: public ErrorData
{
 
public:
 
    virtual wchar_t* getDescription();
    TimeErrorData(char* type, bool isFatal);
    virtual ~TimeErrorData();
 
};
Вот его конструктор, который ни чего не делает, только передаёт конструктору базового класса параметры:
C++
1
2
3
4
//Ошибка!!!
TimeErrorData::TimeErrorData(char* type, bool isFatal):ErrorData({"TIME",type},isFatal)
{   
}
Цитата Сообщение от fasked Посмотреть сообщение
вообще непонятно чего Вы добиваетесь
Вот в принцие и всё, чего я добиваюсь. Хотя код будет рабочий если код ошибки держать не в одной структуре, а разбить на составляющие, тогда конструктор ErrorData будет уже получать два указателя а конструктор TimeErrorData только один и передавать в ErrorData "TIME" и свой указатель. Тогда получится вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//Передаётся по указателю функции обработки ошибки, 
//если в главном модуле задан адрес такой функции,
//а если нет, то генерируется исключение с типом этого класса
class ErrorData
{
 
private:
 
    char* errorId;//Класс ошибки
    char* errorType;//Конкретный тип ошибки
    u1 counter;//Счётчик ошибок
    bool isFatalError;//Флаг фатальности ошибки
 
public:
    
    ErrorData(char* id, char* type, bool isFatal);
    virtual ~ErrorData();
    virtual wchar_t* getDescription()=0;//Выдаёт описание ошибки
    void incCounter();//Увеличивает счётчик числа ошибок, если они повторяются
    u1 getCounter();//Получение значения счётчика
    char* getId();//Считывание id ошибки
    char* getType();//Считывание типа ошибки
    bool getIsFatal();//Фатальна ли ошибка
    void setIsFatal(bool isFatal);//Задание фатальности ошибки
    
};
 
//id=TIME
class TimeErrorData: public ErrorData
{
 
public:
 
    virtual wchar_t* getDescription();
    TimeErrorData(char* type, bool isFatal);
    virtual ~TimeErrorData();
 
};
 
ErrorData::ErrorData(char* id, char* type, bool isFatal)
{
    counter=0;
    errorId=id;
    errorType=type;
    isFatalError=isFatal;
}
 
TimeErrorData::TimeErrorData(char* type, bool isFatal):ErrorData("TIME",type,isFatal)
{   
}
 
Текущее время: 12:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru