увеличить заводскую функцию shared_ptr - PullRequest
0 голосов
/ 30 ноября 2010

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

Если я перезаписываю указатель в методе get_entity, кажется, все работает. Если я перезаписываю указатель в методе get_pointer, это не так.

// 
// typedef boost::shared_ptr<Entity> EntityPtr;

Entity::EntityPtr EntityFactory::get_entity(int type) {

    // My default pointer if everything else falls through
    Entity::EntityPtr e = boost::make_shared<Entity>(type);
    std::cout << e->get_type() << std::endl; // Entity

    switch (type) {
    case 1:
        // This works
        e = boost::make_shared<TextEntity>(type);
        std::cout << e->get_type() << std::endl; // TextEntity
        break;
    case 2:
        // This doesn't work
        get_pointer(e, type);
        std::cout << e->get_type() << std::endl; // Entity
        break;
    }

    return e;

}

// This function can (possibly) overwrite the passed-in pointer
void EntityFactory::get_pointer(Entity::EntityPtr e, int type) {

    // ...

    e = boost::make_shared<TextEntity>(type);

    // ...
}

Мои причины для передачи "e" в метод get_pointer были в том, что мне не всегда нужно изменять указатель. В некоторых случаях get_pointer завершается без изменения указателя вообще.

Я надеюсь, что кто-то может помочь пролить свет на то, что я делаю здесь неправильно. Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2010

Я чертовски озадачен тем, что вы пытаетесь сделать, так как вы передаете целые числа в make_shared.

Ваша проблема может быть решена путем принятия ссылки на Entity::EntityPtr в get_pointer.

...