从向量而不是数组调用类函数

Posted

技术标签:

【中文标题】从向量而不是数组调用类函数【英文标题】:Calling a class function from a Vector instead of an Array 【发布时间】:2012-03-27 20:57:44 【问题描述】:

我目前正在研究一种从文件中加载一堆不同 NPC 并将其加载到我的游戏中的方法。我的所有东西都可以正常使用数组,但我想将其更改为使用向量,因为我可以更改大小以防我需要比数组中可用空间更多的 NPC,所以如果我不只是有一个大部分为空的数组目前我不需要很多NPC。请注意,以下代码来自测试程序,而不是我的实际编程。我做到了,所以我不会不小心弄乱整个项目。

int main()

char input;
bool Running = true;
NPC Creatures[MAX_NPCS];

//InitCreatures loads the X, Y and Type from the file. I know with vectors I have to
//resize it as I go along, Which would be included in the function.
if(Creatures[MAX_NPCS].InitCreatures(Creatures) == false)

    Creatures[MAX_NPCS].CleanUp(Creatures);
    return 0;


while(Running == true)

    cout << "(C)heck an NPC, (A)ttack and NPC or (E)xit the program\n";
    cin >> input;
    switch(input)
    
        case 'C': Creatures[MAX_NPCS].Check(Creatures); break;
        case 'c': Creatures[MAX_NPCS].Check(Creatures); break;
        //The Check function just shows the X, Y and Type of the NPC
        case 'A': Creatures[MAX_NPCS].Attack(Creatures); break;
        case 'a': Creatures[MAX_NPCS].Attack(Creatures); break;
        //Attack shows X, Y and type and then removes that NPC from the array.
        case 'E': Running = false; break;
        case 'e': Running = false; break;
        default: cout << "That was not a valid input\n"; break;
    


Creatures[MAX_NPCS].CleanUp(Creatures);
cout << "Exiting\n";
system("PAUSE");
return 0;

我真正遇到的唯一问题是让 Main 从向量运行 NPC 类函数,而不是像现在这样使用数组。我可以轻松地更改我正在调用的函数中的其他内容以接受向量并正确处理它。

当我尝试使用向量来运行函数时,我只有在遇到这样的情况时才能调用它们:

Creatures[1].Attack(Creatures);

当然,当我这样调用它们时,值不会正确返回,而且我通常会收到错误消息,此外,我不知道当前地图将加载多少个 NPC,如果有的话。

对此的任何帮助将不胜感激。我意识到在编程方面我是一个新手,尤其是在 Vectors 方面。如果需要我的功能代码,我很乐意发布。

【问题讨论】:

呃,像Creatures[MAX_NPCS] 这样的访问是未定义的行为。您最多只能使用 MAX_NPCS-1 的索引。 哦,糟糕,很好。这也是我想要向量的原因。但我觉得我没有正确理解它们。无论如何,这些功能都有保护措施,可以防止您添加过多的 NPC 并正确执行:P std::vector 只不过是一个很好的打包动态数组。只需将.push_back 的东西放入其中,并通过正常的数组访问 (operator[]) 获取它们。你的编程书是怎么说的? 是的,基本上我的理解是向量是一个可调整大小的数组。这就是为什么我想在这个程序中使用它。因为我不知道每张地图会有多少个NPC。那么我将如何从向量中运行我的函数呢?当前的数组设置可以很好地存储 NPC 的 X、Y 和类型。但是我不能让向量调用命令,除非我事先指定有多少个 NPC,直到调用 InitCreatures 才知道。 【参考方案1】:

您可以只创建一个向量并在其中包含第一个元素以便能够调用 InitCreatures 函数(您也可以稍后覆盖第一个生物)。

vector<NPC> Creatures(1);
Creatures[0].InitCreatures(Creatures);

我假设在课堂上你有通过引用传递的参数。

bool InitCreatures(vector<NPC>& x)  ... 

但是,既然你将生物作为你拥有的每个函数的参数(你需要它来检查还是攻击?) - 有一个类来保存 NPC 向量不是更好吗?

【讨论】:

直到我需要向向量中添加更多内容为止。由于所有 NPC 都在该函数中加载,我该如何调整矢量的大小。如果我尝试在该功能中,那么我的电脑不喜欢它。 啊,没关系。这似乎是别的东西。出于某种奇怪的原因,它现在工作正常。从我认为的数组转换时,我只是忘记更改一些东西。感谢您的帮助!

以上是关于从向量而不是数组调用类函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 函数返回一个向量/字符串,但不是一个数组

带有向量的类构造函数中的析构函数调用

如何在另一个类的向量中调用派生类的析构函数

如何将向量转换为数组

c ++向量从构造函数分配对象而不是临时的

重载时如何强制matlab调用常规函数而不是类方法?