创建C时调用对象方法

SAS*_*ROG 3 c++ instantiation

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

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

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

std::vector<A *> As;
Run Code Online (Sandbox Code Playgroud)

如何在同时访问方法的同时将的new实例推回A向量sayA

像这样

As.push_back(new A()->sayA());
Run Code Online (Sandbox Code Playgroud)

只是在这种情况下要指出的A不是我创建的对象,而是图形库的一部分

Rak*_*111 8

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

As.emplace_back(new A())->sayA();
Run Code Online (Sandbox Code Playgroud)

但实际上,IMO这更加清楚:

As.push_back(new A());
As.back()->sayA();
Run Code Online (Sandbox Code Playgroud)

  • @SOFe如果`back()`返回一个迭代器(一次通过迭代器,一次通过`A *`),则需要双重取消引用。但是,由于它是对最后一个对象的引用,因此它是一个只需要一个反引用的“ A *&”。 (2认同)

lub*_*bgr 6

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

auto sayA() {
  std::cout << "A" << std::endl;
  return this;
}
Run Code Online (Sandbox Code Playgroud)

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

As.push_back((new A())->sayA());
Run Code Online (Sandbox Code Playgroud)

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