2015-08-19 2 views
2

В настоящее время я застрял в очень специфической проблеме. У меня есть map из структур нравится:Проверить экземпляр созданного элемента структуры

std::map<int, MyStruct> myMap; 

typedef struct 
{ 
    long a; 
    int b; 
    MyObject* object; 
} MyStruct; 

О создании структур object всегда установлен в nullptr:

void createNewStruct(int id) 
{ 
    MyStruct newStruct{2L, 1, nullptr}; // create with no object 
    myMap.insert(std::pair(id, newStruct)); // store in map 
} 

Я делаю это потому, что я, возможно, тысячи структур в map, но только немногим может понадобиться фактический «объект», который сам по себе довольно большой.

Сам по себе object имеет ограниченный срок службы, и он должен показать, если он в настоящее время не показан, и не отображается, если он отображается в данный момент. Если окончание срока службы объектов достигается она называет остановки (это):

void doShow(int id) 
{ 
    if(myMap[id].object == nullptr) 
    { 
     MyObject* newObject = new MyObject(); 
     connect(object, SIGNAL(stopped(MyObject*), this, (objectStopped(MyObject*)); // create callback to delete object later 

     myMap[id].object = newObject; 
     // do something with object 
    } 
} 

Теперь, если остановлен (это) называется я пытаюсь очистить:

void objectStopped(MyObject* object) 
{ 
    // do something with object 

    delete object; 
    object = nullptr; //???? 
} 

Но очевидно, что это не работает как предполагалось, потому что проверка на nullptr больше никогда не будет правдой.

Так что я хочу, чтобы достичь является: У меня есть map с большим количеством структур, но лишь немногие из этих структур нуждаются в object. Как я могу правильно создать и удалить этот объект?

ответ

1

Если у вас есть компилятор C++ 11 (который вы должны), вы можете использовать id:

connect(object, 
     SIGNAL(stopped(MyObject*), 
     this, 
     []() { delete myMap[id]; myMap[id] = nullptr; }); 
+0

Спасибо за этот намек.Я мысленно застрял в: 'Объект * a = 0x02; Объект * b = a; a = nullptr; b = 0x02; // все еще указывает – xuckz

1

Я думаю, что лучший способ достичь этого, дает в MyStructсобственности из MyObject, а не с помощью внешних функций для управления этим распределением. Если вы это сделаете, ваш дизайн в целом улучшится.

Например, вы можете дать MyStruct некоторые функции управления созданием MyObject структуры: createObject(), чтобы создать одну или destroyObject(), чтобы уничтожить его, функцию, чтобы проверить, если объект присутствует, и вы можете дать MyStruct его собственная функция doShow(), поэтому ваша внешняя функция doShow(int id) получит правильный MyStruct для этого конкретного «идентификатора», а затем вызовет MyStruct::doShow() не более того. Когда вы уничтожите MyStruct объект, он будет также освободить его MyObject, если таковые имеются, автоматически, не заботясь об этом будет обратные вызовы, сигналы/слоты механизмы и т.д.

Таким образом, нижняя строка: Я просто сделать MyStruct объект умнее , и предоставление ему полного собственности класса MyObject. Я уверен, что это улучшит общий дизайн.

+1

Мое мнение таково, что вы должны использовать 'зЬй :: unique_ptr' в структуры для простота, и вместо того, чтобы пытаться «удалить» объект в функции-члене этого объекта (что запутывает), просто убедитесь, что кто-то вызывает функцию «остановить», после этого сбрасывает указатель. –

+0

Я полностью согласен –

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