我想在构造函数
之后设置引用示例:
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;
};
修改
编辑2:
为什么我需要这个? 因为我有另一个类[ExClass]扩展并且必须在构造函数中进行计算:
ExClass::ExClass(float d1, float d2, ...) {
//calculate data from given values
SetData(data);
}
答案 0 :(得分:1)
与引用相反,正确的方法是使用指针而不是引用-可以在对象创建后设置指针。还请注意,引用(或指向)其生存期将在仍然使用时终止的局部变量是一个坏主意。
您的代码可以更改为使用指针和动态分配,或者使用std::unique_ptr
。当然还有其他选择,这些只是示例。
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;
};
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)
你有两个问题:
m_class
)。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;
}