«Передать адрес объекта в вектору» звучит так
std::vector<MyObject *> objectAddresses;
Это вектор указателей на MyObject. Обратите внимание, что вы должны добавлять и удалять указатели вручную. Невозможность удалить указатель объекта из этого вектора при его удалении может легко привести к сбою вашей программы.
В зависимости от требований к производительности, вы можете выбрать контейнер STL, отличный от вектора. Векторы сделают вашу итерацию очень быстрой, но удаление объекта из произвольной позиции в векторе будет дорогостоящим. Без предварительного знания его положения в векторе это также будет сложно. Рассмотрим std :: set.
http://www.cplusplus.com/reference/stl/ перечисляет контейнеры, предоставляемые stl, и приблизительно описывает их производительность.
Когда у вас есть контейнер с указателями, просто зацикливайтесь на каждой записи и вызывайте функцию. Возможно, вам понадобится разыменование дважды, например (* Itor) -> FUNC ()
.
Может быть, это просто ваша терминология, но у меня есть более одного объекта, и
Я не понимаю, как это будет работать. Разум идет дальше вглубь?
Я думаю, что это должно быть больше по линии std :: vector objectAddresses;
Если вы объявляете class MyClass
, вы должны сказать vector<MyClass*>
. Если вы объявите class MyObject
, скажите vector<MyObject*>
. Это будет то же самое для компилятора, поэтому используйте тот, который вам удобнее читать.
std :: vector - это не то, что большинство графических программистов считает вектором (например, 3 значения, обозначающие положение в трехмерном пространстве). Это самоизменяющийся массив. Поэтому, когда вы добавляете значения в вектор (с помощью метода 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();
}
Будет вызывать функцию doWork () для каждого существующего экземпляра MyObject (). Если какие-либо объекты MyObject были уничтожены, а деструктор не может их удалить, разыменованный указатель будет разыменован и будет вызвано неопределенное поведение (возможно, segfault).
std :: set позволяет удалить по значению:
class MyClass
{
public:
static std::set<MyClass *> objAddrs;
MyClass()
{
objAddrs.insert(this);
}
~MyClass()
{
objAddrs.erase(this);
}
};