“将对象的地址传递给向量”听起来像这样
std::vector<MyObject *> objectAddresses;
这是一个指向 MyObject 的指针向量。请注意,您必须手动添加和删除指针。删除对象时未能从该向量中删除对象的指针很容易导致程序崩溃。
根据性能需求,您可能希望选择除矢量以外的 STL 容器。向量将使您的迭代速度非常快,但是从向量中的任意位置移除一个对象会很昂贵。如果不首先知道它在向量中的位置,它也会很困难。考虑 std::set。
http://www.cplusplus.com/reference/stl/列出了stl提供的容器,并大致描述了它们的性能。
一旦有了指针容器,只需对每个条目进行 for 循环并调用函数。您可能需要取消引用两次,例如(*itor)->func().
也许这只是你的术语,但我有不止一个对象,而且
我对这将如何工作感到困惑。介意进一步深入吗?
我认为它应该更符合 std::vector objectAddresses;
如果你声明class MyClass,你应该说vector<MyClass*>。如果您声明class MyObject,请说vector<MyObject*>。对编译器来说也是一样的,所以使用对你来说更易读的那个。
std::vector 并不是大多数图形程序员所认为的向量(例如,3 个值表示 3d 空间中的位置)。它是一个自调整大小的数组。因此,当您向向量添加值时(通过 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);
}
};