1

私はC ++を初めて使用するので、ポインターについて学び、それらの使用に慣れています。

ユーザーが後でタグ キーを使用してアクセスする可能性のあるオブジェクトを格納するために、オブジェクト マップを宣言しました。

map<string,MyObject*> myMap;

myMap に追加するオブジェクトは、メインによって呼び出される関数で作成されます

void myFunction(){
    ...
    MyObject obj1();
    MyObject* objPtr;
    objPtr = &obj1;
    myMap.insert(pair<string,MyObject*>("xxxx", objPtr));
    ...
    } 

この関数を実行すると、オブジェクト ポインターは myMap に完全に挿入されますが、関数の実行後、obj1 への参照が失われます。これは、ポインターとオブジェクトが関数内でローカルに作成されたためだと思います。マップですが、後の空の参照だと思います。

オブジェクトと参照をグローバルに保持するにはどうすればよいですか? ユーザー obj1(m,n) から取得する必要がある変数パラメーターがいくつかあるため、このオブジェクトを関数内に作成したかったのです。助けてくれてありがとう。

4

3 に答える 3

4

コード行

MyObject obj1;

のインスタンスを保持するローカル変数を定義しますMyObject。この変数のコンテキストが離れようとすると、オブジェクトは破棄されます。オブジェクトの破棄は、それらを指すポインターが何らかの方法で通知されることを意味するわけではありません (たとえば、0 に設定されていません)。それらへのアクセスは無効です。

基本的に次のオプションがあります。

  • ローカルではなくヒープ上にオブジェクトを作成します。これは、newキーワードを使用して行われます。しかし、deleteある時点でそのオブジェクトに到達する必要があります。

    MyObject *obj1 = new MyObject(arguments...);
    
  • これはしばしば管理が難しいため、スマート ポインターが発明されました。たとえば、C++11 以降、shared_ptrが追加されました (ただし、プレリリース バージョン C++0x の一部のコンパイラでも使用できます)。このタイプのスマート ポインターは、最後の参照が破棄されるときに、オブジェクトを自動的に削除します。

    map<string,std::shared_ptr<MyObject>> myMap; // Note that I changed the type
    
    std::shared_ptr<MyObject> obj1 = std::make_shared<MyObject>(arguments...);
    myMap.insert(std::make_pair("xxxx", obj1));
    

    ちなみに、テンプレートの種類をstd::make_pair自動的に推測するを使用しました。

  • マップに値を格納します。ポインターをまったく使用しないでください。これは、型をコピーできる場合 (コピーできない型もあります)、および設計上の決定によってコピーが禁止されていない場合のオプションです。ただし、ほとんどの場合、値をマップに格納することをお勧めします。変更したいマップから要素を取得するときは、参照を使用してください:

    MyObject &obj = myMap["xxxx"]; // looking up the key
    obj.doSomeAction();            // modify it; no need to re-insert
    

    参照はポインタと同様に動作します (つまり、あるインスタンスを「指す」だけです) が、いくつかの違いがあります。たとえば、参照は存続期間中常に同じインスタンスを指します (参照を再割り当てすることはできません)。また、それらの構文は値と同じです。つまり、必要ありませ->ん。

個人的には、プログラム内の複数の場所で同じオブジェクトへのポインターを配置する必要がない場合は、3 番目のオプションをお勧めします。これが事実である場合、「共有」ポインタを使用したい場合とまったく同じ「共有」オブジェクトについて話します。最初のオプションは非常に低レベルであり、「時代遅れ」と見なす必要があります。

于 2013-10-27T21:11:51.123 に答える
2

特別な理由がない限り、オブジェクトをマップに格納する方が簡単な場合があります。

map<string, MyObject> myMap;

それで:

void myFunction(){
  ...
  myMap.insert(std::make_pair("xxxx", MyObject()));
  ...
} 
于 2013-10-27T21:11:47.407 に答える
1

オブジェクトを動的にインスタンス化できます。

MyObject* objPtr = new MyObject;

ただし、このインスタンスをもう使用しない場合は、このインスタンスを削除することを忘れないでください。

delete objPtr;
于 2013-10-27T21:09:09.660 に答える