【问题标题】:collection of pointers pointing to objects, clarification指向对象的指针集合,澄清
【发布时间】:2016-09-21 19:18:27
【问题描述】:

我对 c++ 很陌生,所以我在指针方面有很多问题,尽管我理解这个概念。问题是我在 main 中创建了一个指针向量:

ma​​in/Aquarium.cpp

using namespace std;
#include "EntityControl.h"
#include <Windows.h>

int main() {

    EntityControl entity;
    vector<Fish*> fishVector;
    Fish q;
    cout << "fish q = " << &q << endl;
    fishVector.push_back(&q);

        entity.movementController(&fishVector);
        cout << &fishVector << endl;
        system("pause");
     return 0;
}

如您所见,我将可以找到鱼的位置添加到 fishVector,然后我想对 EntityControl 类中的对象做一些事情。但我不知道该怎么做,我尝试使用 for 循环获取它,但是在尝试计算结果时,位置与 main.cpp 中的鱼不同。

EntityControl.cpp

#include "EntityControl.h"


void EntityControl::movementController(std::vector<Fish*> * fishInputVector)
{
        unsigned int x = rand() % xContainer;
        unsigned int y = rand() % yContainer;
        unsigned int z = rand() % zContainer;
        //i.changePosition(x, y, z);
}

EntityControl::~EntityControl()
{
}

stackoverflow 上有几篇这样的帖子,但我不明白答案。我想我需要一些额外的帮助。因此,如果您能尽可能简单地解释一下,我将不胜感激。

问题说明:将 Fish 对象的内存位置添加到 main 中的向量(或任何足够的集合),然后接收内存位置并使用内存位置指向的对象实体控制.cpp

额外问题: 我以为我需要一个指针来更改类中的实际变量值,但是,

void Fish::changePosition(int addX, int addY, int addZ)
{
    xLocation = addX;
    yLocation = addY;
    zLocation = addZ;

    //std::cout <<"VALUE ="<< getX();
}

似乎工作正常,你能解释一下吗? (x,y,z 位置是 Fish 类中的私有全局变量)

  • 如果我创建一个指针,我是否应该删除它所在的对象/变量 指向?它会留在记忆中吗?

  • 有什么好的资源可以阅读对我有帮助吗?

最后的笔记 如果有人可以帮助我,非常感谢。这个问题已经让我发疯了好几个小时。

【问题讨论】:

  • 是的,可能应该删除那个 cout,因为它与问题无关。这只是为了测试目的
  • 我正在测试它是否与我发送给方法的向量相同,现在应该从块代码中删除它,无论如何都会有多条鱼添加到向量中,这就是我不这样做的原因只送一条鱼到那里。感谢您的评论
  • 关于额外问题:您编写的函数是Fish 类(Fish::)的一部分,因此允许修改Fish 的任何数据成员,甚至是私有的。否则私有数据成员将毫无意义。您不需要指针来访问或修改数据成员。你从哪里得到那个的?数据成员名称自动引用调用成员函数的实例的数据成员。
  • 我在某处读到这些方法得到了一个变量的副本,但我可能误解了它,谢谢 ^.^"

标签: c++ pointers vector


【解决方案1】:

由于movementController 的参数是一个指针,您需要通过它间接访问该向量。而且由于向量的元素是指针,因此您需要间接通过它们。所以movementController 中的代码可能是这样的:

void EntityControl::movementController(std::vector<Fish*> * fishInputVector)
{
    for (auto fish_ptr : *fishInputVector) {
        unsigned int x = rand() % xContainer;
        unsigned int y = rand() % yContainer;
        unsigned int z = rand() % zContainer;
        fish_ptr->changePosition(x, y, z);
    }
}

【讨论】:

    【解决方案2】:

    我不能 100% 确定我理解你的问题,但你似乎误解了指针。

    我相信您正在尝试执行所谓的“取消引用”。这是一个允许您调用指针所指对象的方法的操作。您的方法应如下所示:

    void EntityControl::movementController(std::vector<Fish*> * fishInputVector)
    {
        for(int i = 0; i < fishInputVector->size(); i++)
        {
            unsigned int x = rand() % xContainer;
            unsigned int y = rand() % yContainer;
            unsigned int z = rand() % zContainer;
            fishInputVector->at(i)->changePosition(x,y,z);
        }
    }
    

    我在这里更改了两件事:我引用了fishInputVector 的第 i 个元素,它是一个指针。接下来,我使用解引用运算符-&gt;,它允许您访问指针指向的变量上的函数/变量。

    【讨论】:

    • 你说得对,我错过了。我认为@Barmar 与我的观点相同,但就工作示例而言,他的回答确实更正确。
    • 它们几乎是等价的。我的只是使用 C++11 for-range 功能的更简洁的语法。如果他们需要支持较旧的 C++ 实现,则需要您的版本。
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多