crossplatform.ru

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


  Ответ в инициализация родительского класса
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
ViGOur Дата 8.6.2008, 21:04
 
Цитата(Red Devil @ 8.6.2008, 21:20) *
ViGOur, это не будет компилироватся
Мдя, и правда ерунду написал...
Совсем плохой стал, каюсь. :lol:
Red Devil Дата 8.6.2008, 20:20
  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 Дата 8.6.2008, 19:46
 
Цитата(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){}
Litkevich Yuriy Дата 8.6.2008, 18:49
  а сам switch туда нельзя засунуть?
Red Devil Дата 8.6.2008, 17:34
  Если не слишком много возможных вариаций - то можно через тернарный оператор
TReditor::TReditor(const QString &tr_type, QWidget *parent) :
    TableEditor(tr_type == "MyType" ? MY_TYPE : CONST_TYPE, parent);

Тернарные операторы можно соединить, т.е. сделать цепочку из них как и в switch, но только все будет утыкано в ? и : - и разобратся будет сложновато в будующем, т.к. читабельность будет не очень хорошая. Но работать все будет, так как нужно.
Andrew Selivanov Дата 4.6.2008, 11:19
  Мне кажется ты слишком заморачиваешься. Просто вынеси инициализацию из конструктора в метод TableEditor::Init(int type), вызывай его потом с нужным параметром...
ViGOur Дата 4.6.2008, 9:49
  Выбирай сам... :)
ViGOur Дата 4.6.2008, 9: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)
{
    //...
}
Litkevich Yuriy Дата 4.6.2008, 9:12
  в зависимости от переменной!
#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, 8:51
  #define ?
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 11:56