繁体   English   中英

使用 lambda 初始化成员变量

[英]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);

但在我看来,这是一种不受欢迎的方式,第一种方法应该有效,我只是遗漏了一些东西。

您正在通过valuedata传递给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM