LINUX.ORG.RU

Инициализация переменной, до передачи в родительский конструктор

 


0

2

Есть такой класс

class PerlFunctionData : public PerlObjectData {
private:
    SV *rv;
    Local<Value> thisWrapped;

public:
    PerlFunctionData(V8Context* context_, SV *cv)
        : thisWrapped(External::Wrap(this)), PerlObjectData(
              context_,
              Handle<Object>::Cast(
                  context_->make_function->Call(
                      context_->context->Global(),
                      1,
                      &thisWrapped
                  )
              ),
              cv
          )
       , rv(cv ? newRV_noinc(cv) : NULL)
    { }
};
Возникает вопрос: передастся ли в context_->make_function->Call() уже инициализированная переменная thisWrapped или нет? По моим наблюдениям передаётся неинициализированная. Есть ли способ инициализировать её не меняя родительский класс?

Изначально было такое
context_->make_function->Call(
    context_->context->Global(),
    1,
    &External::Wrap(this)
)
Но компилятор ругается, что брать адрес временной переменной нельзя.

★★★

Последнее исправление: Olegymous (всего исправлений: 1)

Порядок инициализация переменных в списке инициализации конструктора совпадает с порядком их объявления в самом классе.

yoghurt ★★★★★
()
Последнее исправление: yoghurt (всего исправлений: 1)

А вообще конструкторы родительских классов вызываются до инициализации переменных в списке, конечно же

yoghurt ★★★★★
()

^^^ плюсую.

скомпилируй с -Wall, будет ворнинг.

nanoolinux ★★★★
()
Ответ на: комментарий от yoghurt

Хм, тогда единственное решение такое?

class PerlFunctionData : public PerlObjectData {
private:
    SV *rv;
    Local<Value> *thisWrapped;

public:
    PerlFunctionData(V8Context* context_, SV *cv)
        : PerlObjectData(
              context_,
              Handle<Object>::Cast(
                  context_->make_function->Call(
                      context_->context->Global(),
                      1,
                      thisWrapped = new Local<Value>(External::Wrap(this))
                  )
              ),
              cv
          )
       , rv(cv ? newRV_noinc(cv) : NULL)
    { }
    ~PerlFunctionData() { delete thisWrapped; }
};

Olegymous ★★★
() автор топика

мамкин борщ уже съел?

порядок инициализации членов класса, однако

вон из профессии

/thread

anonymous
()
Ответ на: комментарий от Olegymous

Единственное решение - писать простые и очевидные конструкции, без лишнего кульхацкерства.

yoghurt ★★★★★
()
Ответ на: комментарий от forCe

шаблон проектирования же, ну

за использование context надо кастрировать без лишних разговоров, да

anonymous
()

Вообще, такие конструкции затрудняют чтение и понимание кода. Если же без этого никак, то см. Base-from-Member idiom.

xaizek ★★★★★
()
Ответ на: комментарий от shamaz

не дерзи, юноша. я тебе в соседнем треде за ракеты рассказываю.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.