2015-06-09 3 views
-1

Мне нужно создать структуру, статическую переменную, чтобы отслеживать, сколько структур существует, а также список всех существующих структур. У меня возникли проблемы с созданием этого списка и соответствующего конструктора. До сих пор ястатический массив структур для отслеживания всех структур

class MyStruct{ 
public: 
    static int i; 
    static MyStruct *AllStructs; 
    MyStruct(){i++; (AllStructs++)=this;} //error happens here 
}; 

int MyStruct::i=0; 
MyStruct MyStruct::*AllStructs; 

int main(){...} 

Как вы можете видеть, что я пытался сделать это путем создания статического массива, который будет добавлен в качестве части конструкторы, но компилятор дает мне ошибку: «Lvalue требуется в качестве левого операнда назначение "в том месте, которое я указал. Это не позволяет мне назначать новые структуры для моего статического массива.

Что я делаю неправильно? Имейте в виду, что указатели - это проклятие моей жизни, поэтому, пожалуйста, объясните это мне, как и маленькому ребенку. Большое спасибо.

+4

'AllStructs' - это просто неинициализированный указатель, а не массив - вместо этого используйте' std :: vector'. –

+0

Вы выделяете 'MyStruct MyStruct :: * AllStructs;' где угодно? – 101010

ответ

0

Когда вы определяете MyStruct MyStruct::*AllStructs;, все, что вы делаете, выделяет память для одного указателя на объект MyStruct, а не на самом деле создает пространство для массива из них. Этот массив, который вы хотите, должен иметь действительное место памяти, для которого он предназначен, чтобы он мог жить, где он может хранить свою копию всех указателей, которые вы хотите. Это, скорее всего, будет беспорядочным, поэтому вместо этого вы должны использовать статический std::vector для управления распределением памяти для MyStruct. Простой в этом отношении:

#include <vector> 
#include <iostream> 
class MyStruct{ 
public: 
static std::vector<MyStruct*> AllStructs; 
MyStruct(){AllStructs.push_back(this);} 
}; 
std::vector<MyStruct*> MyStruct::AllStructs; 


int main() { 
    MyStruct ms; 
    MyStruct ms2; 
    std::cout << MyStruct::AllStructs.size() << std::endl; 

} 

Надеюсь, что это поможет!

+0

Это отлично работает, спасибо за вашу помощь. Теперь я пытаюсь сделать итератор для доступа к отдельным членам AllStructs, но
vector :: iterator vi = * AllStructs.begin(); говорит мне, что «AllStructs не был объявлен в этой области» (дайте мне минуту, чтобы выяснить, как отформатировать это) – Simeon

+0

В течение жизни я не могу понять, как добавить в эти комментарии строки. Просто проигнорируйте
, надеюсь, вы сможете понять, что я пытаюсь сказать. – Simeon

+0

Это MyStruct :: AllStructs, а не AllStructs, которые вам нужно назвать –

Смежные вопросы