Как установить ссылку после конструктора? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу установить ссылку после конструктора

Пример:

class OtherClass
{
public:
    OtherClass() : m_class(Class()){}

    inline void SetData(int data1, int data2)
    {
        //calculate data3

        // I tried:
        m_class = Class(data3);
        //but it doesn't worked
    }

protected:
private:
    Class& m_class;
};

Редактировать:

  • Исключением является: векторный индекс вне диапазона, потому что у меня есть векторы glm в классе.
  • Мне также нужно вызывать функции в моем классе.

Редактировать 2:

Зачем мне это нужно? Поскольку у меня есть другой класс [ExClass], который расширяется и который должен вычисляться в конструкторе:

ExClass::ExClass(float d1, float d2, ...) {
//calculate data from given values
SetData(data); 
}

1 Ответ

0 голосов
/ 11 мая 2018

У вас есть две проблемы:

  1. Члены эталонного класса (т.е. m_class) должны быть инициализированы при создании объекта.
  2. Однако оба ваших Class экземпляра (один в конструкторе и один в SetData) помещаются в стек и сразу же выталкиваются, что делает ссылку недействительной.

Что вам нужно сделать, это убедиться, что ваш объект класса действительно живетчерез вызов функции.Одним из способов достижения этого является выделение его перед передачей его конструктору OtherClass или функции SetData:

class Class {};

class OtherClass
{
public:
    OtherClass(Class& c) : m_class(c){}

    inline void SetData(Class& c)
    {
        m_class = c;
    }

protected:
private:
    Class& m_class;
};

int main()
{
    Class a;
    OtherClass c(a);

    Class b;
    c.SetData(b); // changes m_class

    return 0;
}

Живой пример здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...