7

People という名前のクラスがあるとします。これらの人々へのポインターをマップに保存しています

map<string, People*> myMap;

新しい People を作成するには、maps [] 演算子を使用します。

myMap["dave"]->sayHello();

しかし、これによりセグメンテーション エラーが発生し、People クラスのコンストラクターも呼び出されません。

私も試しました

 myMap.insert( std::make_pair( "dave", new People() ));

しかし、それは何も変更しませんでした。コンストラクターはまだ呼び出されず、プログラムはこのコードの処理をセグメンテーション エラーでシャットダウンします。

ポインターを含むマップにアクセスして操作するにはどうすればよいですか? 上記が機能しないのはなぜですか。コンパイル時のエラーや警告は表示されません。

どんな洞察も大歓迎です、ありがとう

4

4 に答える 4

12

マップを考えると:

map<string, People*> myMap;

operator[]新しいものは作成されません。つまり、何も指さないポインタPeopleが作成されます。People*

最も簡単な解決策は、マップにポインタではなく実際に人が含まれるようにすることです。例:

map<string, People> myMap;

その後、メモリ管理はすべてあなたのために処理され、を使用しoperator[]て必要に応じて新しい人を構築します。

于 2012-04-26T12:58:38.087 に答える
3

試す

myMap["dave"] = new People(....);

newコンストラクターを呼び出し、ポインターを返し、それをマップに挿入します。

ただし、メモリリークには注意する必要があります。この問題を解決するには、スマート ポインターを使用します。

于 2012-04-26T12:59:33.747 に答える
0

ヒープを割り当てたいPeopleがマップを使用する場合は、Boost Pointer Containers、特にboost::ptr_map. ヘッダーのみなので、追加のライブラリをコンパイルする必要はありません。

#include <iostream>
#include <string>
#include <boost/ptr_container/ptr_map.hpp>

struct People
{
    int age;
};

typedef boost::ptr_map<std::string,People> PeopleMap;

int main(int,char**)
{
    PeopleMap data;

    data["Alice"].age = 20;
    data["Bob"].age = 30;

    for (PeopleMap::const_iterator it = data.begin(); it != data.end(); ++it)
        std::cout << "Name: " << it->first << " Age: " << it->second->age << std::endl;

    return 0;
}
于 2012-04-26T13:28:38.150 に答える
0

使用してみてください:

People* new_people = new People (member_variable1,member_variable2);

myMap.insert(std::pair<std::string, People*>("key for string",new_people) );

もしくはそうでないか:

People new_people(member_variable1,member_variable2);
myMap.insert(std::pair<std::string, People*>("key for string",&new_people) );

どちらも活躍します!!!

于 2013-04-06T00:05:20.107 に答える