Передайте ссылку на карту в C ++ - PullRequest
2 голосов
/ 09 декабря 2010

Я хочу передать ссылку на карту, а НЕ размещать ее где-нибудь еще - вот что я работаю:

map<string, Node> _neighbors; // Instance Variable


Node& neighbor(Node& neighbor) {
    cout << "HOST: "<< neighbor.host() << " ADDRESS: " << &neighbor << endl;
    string key = this->getKey(neighbor);

    if(!_neighbors.count(key)) {
        _neighbors[key] = neighbor;
        cout << "HOST (AFTER): "<< _neighbors[key].host() << " ADDRESS: " << &_neighbors[key] << endl;
        neighbor.neighbor(*this);
    }

    return *this;
}

Вывод: когда я звоню n1.neighbor(n2); // n1 is a Node with host=1 and n2 is a Node with host=2

ВЕДУЩИЙ: 2 АДРЕС: 0x7fff5fbfe580

ВЕДУЩИЙ (ПОСЛЕ): 2 АДРЕС: 0x100100128

1 Ответ

4 голосов
/ 09 декабря 2010

Нельзя хранить ссылки в контейнере STL. Контейнеры хранят объекты, и ссылки не являются объектами (кроме того, объекты, хранящиеся в контейнере, должны быть назначаемыми, а ссылки не могут назначаться).

Вы хотите использовать карту указателей:

std::map<std::string, Node*>

Также остерегайтесь вопросов собственности. Вы должны убедиться, что объекты не уничтожены, пока каждый, у кого есть ссылка на них, не использует их. Если у вас есть объекты, используемые в нескольких местах, рассмотрите возможность использования интеллектуального указателя общего владения, такого как shared_ptr, для управления временем жизни объекта. Ручное управление ресурсами в C ++ чревато опасностью, и его следует избегать любой ценой.

...