Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: инициализация родительского класса
Форум на CrossPlatform.RU > Разработка > С\С++
Litkevich Yuriy
есть такой код:
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
#define ?
Litkevich Yuriy
в зависимости от переменной!
#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
Как вариант можно использовать шаблон:
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
Выбирай сам... :)
Andrew Selivanov
Мне кажется ты слишком заморачиваешься. Просто вынеси инициализацию из конструктора в метод TableEditor::Init(int type), вызывай его потом с нужным параметром...
Red Devil
Если не слишком много возможных вариаций - то можно через тернарный оператор
TReditor::TReditor(const QString &tr_type, QWidget *parent) :
    TableEditor(tr_type == "MyType" ? MY_TYPE : CONST_TYPE, parent);

Тернарные операторы можно соединить, т.е. сделать цепочку из них как и в switch, но только все будет утыкано в ? и : - и разобратся будет сложновато в будующем, т.к. читабельность будет не очень хорошая. Но работать все будет, так как нужно.
Litkevich Yuriy
а сам switch туда нельзя засунуть?
ViGOur
Цитата(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
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, она тогда конечно статической должна будет быть.
ViGOur
Цитата(Red Devil @ 8.6.2008, 21:20) *
ViGOur, это не будет компилироватся
Мдя, и правда ерунду написал...
Совсем плохой стал, каюсь. :lol:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.