我如何在构造函数后设置引用?

时间:2018-05-11 16:40:38

标签: c++ reference

我想在构造函数

之后设置引用

示例:

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); 
}

2 个答案:

答案 0 :(得分:1)

与引用相反,正确的方法是使用指针而不是引用-可以在对象创建后设置指针。还请注意,引用(或指向)其生存期将在仍然使用时终止的局部变量是一个坏主意。

您的代码可以更改为使用指针和动态分配,或者使用std::unique_ptr。当然还有其他选择,这些只是示例。

选项1-指针和动态分配

class OtherClass
{
public:
    OtherClass() : m_class(nullptr){}
    ~OtherClass() {
        delete m_class;
    }
    void setData(int data1, int data2)
    {
        // ... calculate data3 ...

        m_class = new Class(data3);
    }
    bool hasInnerObj() const {
        return m_class; // or: return m_class != nullptr;
    }
    /** call this function only if hasInnerObj() returned true */
    Class& getInnerObj() {
        return *m_class;
    }
private:
    Class* m_class;
};

选项2-std :: unique_ptr

class OtherClass
{
public:
    void setData(int data1, int data2)
    {
        // ... calculate data3 ...

        m_class = std::make_unique<Class>(data3);
    }
    bool hasInnerObj() const {
        return m_class; // or: return m_class != nullptr;
    }
    /** call this function only if hasInnerObj() returned true */
    Class& getInnerObj() {
        return *m_class;
    }
private:
    std::unique_ptr<Class> m_class;
};

答案 1 :(得分:0)

你有两个问题:

  1. 创建对象时需要初始化引用类成员(即m_class)。
  2. 但是,你的Class个实例(构造函数中的一个,SetData中的一个)都被放在堆栈上并立即弹出,使引用无效。
  3. 您需要做的是确保您的类对象实际上通过函数调用生效。实现这一目标的一种方法是在将其传递给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;
    }
    

    Live example here