crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> инициализация родительского класса
Litkevich Yuriy
  опции профиля:
сообщение 4.6.2008, 8:37
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


есть такой код:
h:
class TReditor : public TableEditor
{
public:
    TReditor(QWidget *parent = 0);
};

cpp:
TReditor::TReditor(QWidget *parent) : TableEditor(MY_CONST, parent)
{
...
}

т.е я инициализировал родительский класс некой константой, а тепрь мне понадобилось сделать конструктор который принимает некую переменную:
h:
class TReditor : public TableEditor
{
public:
    TReditor(const QString &tr_type, QWidget *parent = 0);
};

и в зависимости от того какой константе она равна, инициализировать родительский класс, как бы это сделать, как в теле конструктора, например, проинициализировать родителя?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.6.2008, 8:51
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


#define ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.6.2008, 9:12
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


в зависимости от переменной!
#define на этапе компиляции только.
У меня родительский конструктор объявлен так:
TableEditor(int type, QWidget *parent = 0), а дочернему передается строковая переменная.
т.е. есть такая часть строки:
: TableEditor(MY_CONST, parent)
как ее засунуть в тело конструктора, чтоб получилось примерно такое:
switch (tr_type)
{
  case STR_CONST_1:  :TableEditor(INT_CONST_1, parent);
  case STR_CONST_2:  :TableEditor(INT_CONST_2, parent);
  case STR_CONST_3:  :TableEditor(INT_CONST_3, parent);
}

но эта форма записи неправильная, как я понимаю.
Есть ли иной способ инициализации родительского класса, кроме:
MyClass::MyClass(Type *var) : MyParentClass(var)
{
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.6.2008, 9:40
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Как вариант можно использовать шаблон:
template<const int nConst>
class TReditor : public TableEditor
{
public:
    TReditor(QWidget *parent = 0);
};

template<const int nConst>
TReditor<nConst>::TReditor(QWidget *parent) : TableEditor(nConst, parent)
{
    //...
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.6.2008, 9:49
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Выбирай сам... :)

Сообщение отредактировал ViGOur - 4.6.2008, 9:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 4.6.2008, 11:19
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Мне кажется ты слишком заморачиваешься. Просто вынеси инициализацию из конструктора в метод TableEditor::Init(int type), вызывай его потом с нужным параметром...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 8.6.2008, 17:34
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


Если не слишком много возможных вариаций - то можно через тернарный оператор
TReditor::TReditor(const QString &tr_type, QWidget *parent) :
    TableEditor(tr_type == "MyType" ? MY_TYPE : CONST_TYPE, parent);

Тернарные операторы можно соединить, т.е. сделать цепочку из них как и в switch, но только все будет утыкано в ? и : - и разобратся будет сложновато в будующем, т.к. читабельность будет не очень хорошая. Но работать все будет, так как нужно.

Сообщение отредактировал Red Devil - 8.6.2008, 17:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.6.2008, 18:49
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а сам switch туда нельзя засунуть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 8.6.2008, 19:46
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Litkevich Yuriy @ 8.6.2008, 19:49) *
а сам switch туда нельзя засунуть?
Можно, но только в макрос, примерно так:
#define SWITCH_MACROS(tr_type) /
switch (tr_type) /
{ /
  case STR_CONST_1:  :TableEditor(INT_CONST_1, parent); /
  case STR_CONST_2:  :TableEditor(INT_CONST_2, parent); /
  case STR_CONST_3:  :TableEditor(INT_CONST_3, parent); /
}

TReditor::TReditor(const QString &tr_type, QWidget *parent) : TableEditor( SWITCH_MACROS( tr_type), parent){}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 8.6.2008, 20:20
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


ViGOur, это не будет компилироватся ^_^

Litkevich Yuriy
Цитата
а сам switch туда нельзя засунуть?

Насколько я знаю нет.
Можно сделать фунцкию, которая будет возвращать значение.

#include <iostream>
#include <string>

int ConstructorInit(const std::string & sStr)
{
    if (sStr == "1")
        return 1;
    if (sStr == "2")
        return 2;
    return -1;
}

class Foo
{
public:
    Foo(int nParam)
    {
        std::cout<<nParam<<std::endl;
    }
};

class Bar : public Foo
{
public:
    Bar(std::string & sParam) : Foo(ConstructorInit(sParam))
    {}
};

int main()
{
    Bar(std::string("1"));      // 1
    Bar(std::string("14"));    // -1
    Bar(std::string("2"));      // 2
    return 0;
}


Ну и красивше конечно сделать эту функцию методом класса TREditor или TableEditor, она тогда конечно статической должна будет быть.

Сообщение отредактировал Red Devil - 8.6.2008, 20:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.7.2020, 21:46