【问题标题】:How can I pass a pointer to the constructor of the object when instantiating the object with push_back()?使用 push_back() 实例化对象时,如何将指针传递给对象的构造函数?
【发布时间】:2016-12-06 21:59:52
【问题描述】:

我正在尝试实现以下目标,类管理器的单个对象正在尝试创建许多类工作者对象。 manager 对象将它自己作为对 worker 对象的引用传递,以便 worker 对象可以根据 manager 对象的状态改变它们的行为。

class manager; 

class worker{
public:
  worker(manager &boss);

};

class manager{

  public:
  unsigned int currentMethod = 5;

  manager(int numofWorkers);
};

我尝试实现这一点的方式是,当调用 manager 的构造函数时,我创建一个工人向量并尝试 push_back(this) aka manager 对象。

manager::manager(int numOfWorkers){

  std::vector<worker> manyWorkers;

  for(int i = 0; i < numOfWorkers;i++){
    manyWorkers.push_back(this);
  }
}

worker::worker(manager &boss){
  std::cout << "Current method is " << boss.currentMethod << std::endl; 
}

这段代码的调用方式是

int main(int argc, char *argv[]){

  manager manag;

  return 0;
}

事实证明,push_back(this) 并没有将“this”传递给类的构造函数,尽管 push_back() 调用了构造函数。我也试过 manyWorkers(this).push_back 也不起作用。

使用 push_back() 实例化对象时,如何将指针传递给 manyWorkers 对象的构造函数?

我不知道该怎么称呼我想要实现的目标,并且无法找到解决方案。

【问题讨论】:

  • 如果您希望您的容器管理多态引用,您需要重新定义您的容器,以便它管理指针,或者更好的是,共享指向基类的指针。

标签: c++ constructor


【解决方案1】:

使用emplace_back 调用带参数的构造函数:

manyWorkers.emplace_back(*this);

注意它应该是*this,因为您正在调用的构造函数 (worker(manager &amp;boss);) 通过引用获取 manager 参数,而不是作为指针。

【讨论】:

  • 谢谢,这解决了我的问题。我可以在两分钟内接受这个答案。
  • 请注意,emplace_back() 仅适用于 C++11 及更高版本。在早期版本(和更新版本)中,push_back(*this)push_back(worker(*this)) 应该可以工作。
  • @RemyLebeau 感谢您的有用强调。
【解决方案2】:

不是简单地将this 存储在向量中(这似乎是您想要存储工作人员),您需要实例化一个新工作人员,然后将其推回向量上。

std::vector<*worker> manyWorkers; // Use * since we are dynamically allocating
for(int i = 0; i < numOfWorkers;i++){
    worker* myWorker = new worker(this);
    manyWorkers.push_back(myWorker);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多