gpt4 book ai didi

c++ - 迭代类中的每个对象

转载 作者:行者123 更新时间:2023-11-30 02:07:35 24 4
gpt4 key购买 nike

由于我正在制作的游戏的性质,我需要能够即时随机创建对象。我需要能够每秒更改一个类的所有当前现有对象的变量 60 次。

有人告诉我,尽管 C++ 无法反射,但我可以将对象的地址传递给 vector 。不幸的是,我对如何做到这一点有点困惑。有更好的解决方案吗?如果没有,有人可以提供示例代码吗?

tl;博士?我需要对一个类中所有对象的变量运行一个函数。怎么办?

最佳答案

“将对象的地址传递给 vector ”听起来像这样

std::vector<MyObject *> objectAddresses;

这是指向 MyObject 的指针 vector 。请注意,您必须手动添加和删除指针。删除时未能从该 vector 中删除对象的指针很容易使您的程序崩溃。

根据性能需求,您可能希望选择 Vector 以外的 STL 容器。 vector 将使您的迭代速度非常快,但是从 vector 中的任意位置移除对象将是昂贵的。如果不首先知道它在 vector 中的位置,它也会很困难。考虑 std::set。

http://www.cplusplus.com/reference/stl/列出了STL提供的容器,并大致描述了它们的性能。

一旦您有了指针容器,只需对每个条目进行 for 循环并调用该函数。您可能需要取消引用两次,例如(*itor)->func().

Maybe it's just your terminology, but I have more than one object, and I'm confused as to how this would work. Mind going further into depth? I'm thinking it should be more along the lines of std::vector objectAddresses;

如果声明class MyClass , 你应该说 vector<MyClass*> .如果你声明 class MyObject ,说 vector<MyObject*> .它对编译器来说是一样的,所以使用对你来说更易读的那个。

std::vector 并不是大多数图形程序员所认为的 vector (例如,3 个值表示 3d 空间中的一个位置)。它是一个自动调整大小的数组。因此,当您向 vector 添加值(通过 push_back 方法)时,它会检查是否分配了足够的内存来保存附加值,并在必要时重新分配更大的内存块。

class MyClass
{
public:
static std::vector<MyClass *> objAddrs;
MyClass()
{
objAddrs.push_back(this);
}
~MyClass()
{
// Find this in objAddrs & objAddrs.erase()
}

void doWork()
{
// something useful here
}
};

将导致 MyClass 的每个实例在构造时将其自己的地址添加到 objAddrs 的末尾。请记住,析构函数必须删除相同的地址!

for(std::vector<MyObject *>::iterator itor=MyClass::objAddrs.begin(); itor!=MyClass::objAddrs.end(); ++itor)
{
(*itor)->doWork();
}

将在每个现有的 MyObject() 实例上调用 doWork() 函数。如果任何 MyObjects 已被销毁并且析构函数无法删除它们,则悬空指针将被取消引用并且将调用未定义的行为(可能是段错误)。

std::set 允许您按值删除:

class MyClass
{
public:
static std::set<MyClass *> objAddrs;
MyClass()
{
objAddrs.insert(this);
}
~MyClass()
{
objAddrs.erase(this);
}
};

关于c++ - 迭代类中的每个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7655126/

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