[英]Initializing member variables with a lambda
假设我有一个模板类:
template<class T>
class Entity
{
public:
Entity(std::function<void(T*)> init, int idx) : index(idx)
{
init(data);
}
T* getData(){ return Data; }
private:
int index;
T* data;
};
我创建了一个类的实例,如下所示:
Entity<Button> myEnt([](Button* button){
button = new Button();
/* some complex, **unique**, initialization of button */
}, 1);
这将编译,但是当我调用getData()
并尝试使用其他函数中返回的指针时,程序会崩溃。 我认为这是因为存在data
未正确初始化的错误,但我不知道为什么!
fwiw 如果我将Entity
构造函数更改为:
Entity(std::function<T*(void)> init, int idx) : index(idx)
{
data = init();
}
然后这样调用它:
Entity<Button> myEnt([](){
Button* button = new Button();
/* some complex, **unique**, initialization of button */
return button;
}, 1);
但在我看来,这是一种不受欢迎的方式,第一种方法应该有效,我只是遗漏了一些东西。
您正在通过value将data
传递给init()
,这意味着 lambda 正在接收data
的副本。 因此,lambda 为其输入参数分配的任何值都将分配给副本,而不会反映回data
。
您需要通过引用传递data
,例如:
template<class T>
class Entity
{
public:
Entity(std::function<void(T*&)> init, int idx) : index(idx)
{
init(data);
}
T* getData(){ return data; }
private:
int index;
T* data;
};
Entity<Button> myEnt([](Button* &button){
button = new Button();
/* some complex, **unique**, initialization of button */
}, 1);
如果要初始化指针成员,则需要指向成员指针的引用或指针,而不是指针的值。
template<class T>
class entity
{
public:
Entity(std::function<void(T**)> init, int idx) : index(idx)
{
init(&data);
}
T* getData(){ return data; }
Private:
int index;
T* data;
}
像这样使用它:
Entity<Button> myEnt([](Button** button){
// you need a pointer to the pointer in order to initialize it
*button = new Button();
/* some complex, **unique**, initialization of button */
}, 1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.