【问题标题】:How to store object pointers in an array如何将对象指针存储在数组中
【发布时间】:2016-03-26 02:02:22
【问题描述】:

我对 c++ 还很陌生,这个问题让我很不爽。 在我的项目中,我使用 SFML 库来创建小行星。我声明了一个名为_asteroids 的类,并希望在该类中创建一堆小行星对象。有人建议我将对象存储在数组中。后来我知道不能将对象存储在数组中,但可以存储指向对象的指针。

总之,我想:

-在_asteroids类中创建对象

-将指向这些对象的指针存储在数组中

-能够通过数组中的指针调用这些对象并更改它们的值

我该怎么做呢?这是我的一些代码:

class _asteroids{
    float angle; //Angle
    sf::Vector2f a_pos; //Position
    sf::Vector2f a_vel; //Velocity
    void makeAsteroids(int); //This generates the asteroid's appearance
    bool Remove(); //If this is false the object is removed

    public:
    void Update(); //This updates the position
};

【问题讨论】:

  • 回答标题中的问题,和普通数组一样?你试过什么?你的尝试有什么问题?此外,如果您想在运行时从“数组”中添加和删除对象,请考虑使用std::vector
  • 哪一部分是问题:创建对象、获取指向它们的指针,还是将事物放入数组中?
  • 我尝试过像这样使用数组:foo[] = new _asteroids
  • 声明 int foo[] 声明了一个 intempty 数组。 C 风格的数组在编译时需要有一个固定的大小,当然是你想要在数组中的对象的数组,例如_asteroids foo[64].
  • @user2840146 有asteroids 没有意义,但没有asteroid

标签: c++ arrays pointers object


【解决方案1】:

在 C++ 中,如果可能/合理的话,您应该避免使用(原始)指针和 C 风格的数组。 C++ 提供标准容器。与 C 风格的数组一样,它们可以保存所有类型的元素类型,但它们具有 C 风格的数组所没有的一些优点。例如,大多数容器可以在您需要时增长/缩小 - 换句话说,它们的大小可以在您添加或删除元素时自行调整。最重要的是,它们具有许多成员函数,可让您以简单的方式对包含的元素进行操作。

vector 容器非常受欢迎。在许多方面,一旦添加了元素,它就像一个数组,即您使用var[i] 访问元素。您可以使用push_back 将元素添加到向量的末尾。

例子:

std::vector<_asteroids> allAsteroids;

allAsteroids.push_back(_asteroids()); // Add _asteroids object to end of vector
allAsteroids.push_back(_asteroids()); // Add _asteroids object to end of vector
allAsteroids.push_back(_asteroids()); // Add _asteroids object to end of vector

cout << allAsteroids.size() << endl;  // Will print 3

for (auto& a : allAsteroids)  // Iterate over all asteroids in the vector
{
    a.Update();  // Call Update for current element
}

// The same as above in a different way
for (int i = 0; i < allAsteroids.size(); i++)
{
    allAsteroids[i].Update();  // Call Update for i'th element
}

这只是您可以使用vector 执行的几个示例。还有很多。

查看http://www.cplusplus.com/reference/vector/vector/ 了解更多信息 - vector 的所有成员函数都显示在该站点的左侧。

【讨论】:

    【解决方案2】:

    当然可以在 std::vector 中保存 Asteroid

    class Asteroid {};
    
    std::vector<Asteroid> asteroids;
    
    Asteroid as1;
    asteroids.push_back(as1);
    

    【讨论】:

    • asteroids.push_back 是做什么的?
    • 谢谢,它工作得很好:将所有类对象放在向量中允许我按照我想要的方式销毁和跟踪它们。
    猜你喜欢
    • 2013-05-15
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2015-03-24
    • 2014-04-21
    相关资源
    最近更新 更多