gpt4 book ai didi

c++ - 对象如何将自身添加到该对象的类中的 vector ?

转载 作者:行者123 更新时间:2023-12-02 10:37:56 24 4
gpt4 key购买 nike

我上课很新。

粒子如何将自身添加到类内部的std::vector中?

我的代码:

std::vector<Particle> particles;

class Particle
{
public:
Particle(sf::Vector2f position)
{
particles.push_back(/*add this Particle into vector particles*/);
}
};

最佳答案

std::vector<Particle>按值存储粒子,因此它不能在该 vector 上添加“自身”,它可以添加一个副本,但这也许不是您想要的。
emplace_back可用于将粒子构造到 vector 本身中:

particles.emplace_back(position); // Will call Particle(position)

如果您确实想要一个副本,只需遵循 this指针,但这可能会造成混淆。不要在copy / move构造函数或copy / move赋值运算符中执行此操作,因为 vector 本身可以在插入/删除/等过程中调用它们。
Particle(sf::Vector2f position)
{
particles.push_back(*this);
}

否则,您可以将指针存储在 vector 中。这带来了额外的问题,例如谁负责释放它们,以及诸如粒子系统之类的事情会对性能产生重大影响。
std::vector<Particle*> particles;

class Particle
{
public:
Particle(sf::Vector2f position)
{
particles.push_back(this); // Dangerous
// If an exception happens after push_back this object will be destroyed,
// but particles will still contain that now invalid pointer.
}
};


...

auto particle = new Particle(position); // Who deletes this?

如果粒子负责删除,则可以使用 std::unique_ptr,但是在构造函数中这样做可能是不安全的。
std::vector<std::unique_ptr<Particle>> particles;

class Particle
{
public:
Particle(sf::Vector2f position)
{
particles.push_back(std::unique_ptr<Particle>(this)); // Dangerous
// If an exception happens in push_back or after this in the constructor
// the exception will cause this Particle to be destroyed, but this unique_ptr
// will be left with an invalid pointer, and try and delete it as well.
}
};


...

new Particle(position);

最好在其他功能中在外部执行。
std::vector<std::unique_ptr<Particle>> particles;

class Particle
{
public:
Particle(sf::Vector2f position)
{}
};
...
particles.push_back(std::make_unique<Particle>(position));

关于c++ - 对象如何将自身添加到该对象的类中的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59393566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com