在创建 c++ 期间调用对象方法

Calling object method during creation c++

本文关键字:调用 对象 方法 创建 c++      更新时间:2023-10-16

所以假设我有一个对象,比如A,像这样

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

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

std::vector<A *> As;

我可以在new A实例的同时访问 sayA 方法的同时将实例推送回向量吗?

喜欢这个

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

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

您可以在 C++17 中使用 emplace_back

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

但实际上,IMO 这更清楚:

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

sayA返回指向实例的指针。喜欢这个:

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

,然后按如下方式插入实例。

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

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

基本上是的,如果你确保sayA()会返回this,因为push_back()会期望指向A的指针,而不是void,这是当前返回类型的sayA()。如果你返回任何其他指向A的指针,那么你将泄漏你新分配的对象,因为没有办法删除它。

为什么你想有指向A的指针向量,如果你可以std::vector<A> As;,然后你可以按照其他答案的建议调用sayA(),那么你以后会头疼地删除它们。