crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 29.3.2024, 18:40