创建C时调用对象方法

时间:2019-07-17 07:31:01

标签: c++ instantiation

所以说我有一个像这样的对象A

class A {
  private:
    int x;
  public:
    A(){};
    ~A(){};
    void sayA() {
      std::cout << "A" << std::endl;
    }
};

现在,如果我有一个指向A的指针向量

std::vector<A *> As;

我可以在同时访问new方法的同时将A的{​​{1}}个实例推回向量吗?

sayA

在这种情况下,只需指出As.push_back(new A()->sayA()); 不是我创建的对象,它是图形库的一部分

3 个答案:

答案 0 :(得分:7)

您可以(ab)在C ++ 17中使用emplace_back

As.emplace_back(new A())->sayA();

但是,实际上,IMO这更清楚了:

As.push_back(new A());
As.back()->sayA();

答案 1 :(得分:5)

您可以让sayA返回一个指向实例的指针。像这样:

auto sayA() {
  std::cout << "A" << std::endl;
  return this;
}

,然后按如下所示插入实例。

As.push_back((new A())->sayA());

但是除了使它起作用之外,这很尴尬并且很难阅读。考虑使用智能指针向量,并先插入,然后调用方法。如果sayA是对象构造的一部分,请从A的构造函数中调用它。

答案 2 :(得分:0)

基本上是,如果,请确保sayA()返回this,因为push_back()会期望指向A的指针,而不是无效的指针是sayA()的当前返回类型。并且,如果您返回任何其他指向A的指针,则将泄漏新分配的对象,因为无法删除它。

但是

为什么要拥有指向A的指针向量,而又想在以后仅删除std::vector<A> As;然后又可以调用sayA()作为其他建议的答案的麻烦的原因。< / p>