これが明らかである場合はお詫び申し上げます。過去 1 時間、これについて頭を悩ませていたので、最小限の例を提供しようと思います。これは簡単なことだと確信しています。
私は次のものを持っています:
class Table { /* implementation superfluous */ };
typedef boost::shared_ptr<Table> TablePtr;
後で、データベース クラスで:
class Database{
typedef std::map<std::wstring, TablePtr> table_map_type;
table_map_type tableCache_;
};
そして、テーブルを取得する演算子を定義します。
TablePtr Database::operator[](const std::wstring& name) {
table_map_type::iterator it(tableCache_.find(name));
if(it != tableCache_.end())
return it->second;
// not found, create
TablePtr ret(new Table());
tableCache_[name] = ret;
return ret;
};
今起こっていることは、これに対する私の最初の呼び出しでは問題ありません。指定されたテーブル名で何も見つからず、作成されてマップに配置され、共有ポインター内に返されます。
この問題は、後で同じインスタンスに戻って同じ名前を探すときに発生します。それを正しく見つけて、 に戻りますreturn it->second
。ただし、そのオブジェクトの次の即時の呼び出しは、作成されたものではないオブジェクトで悪魔と鼻に飛び込みます。
明らかな何かが欠けていると確信しています。前もって感謝します。
編集
私の最小限のコード例が機能したので、さらに深く掘り下げる必要があります。最初の挿入でさえ正しく動作しないようです。operator[]
上記の関数内で、TablePtr
構築された はその中に有効なテーブル オブジェクトを保持します (内部名が として表示されるためL"_contract"
です。簡単なテスト行を実行しました。
db::TablePtr first((*db)[L"_contract"]);
その関数内では、テーブル名は_contract
. first
デバッガで調べると、 のテーブル名が表示されL""
ます。どこかで何かがおかしくなっている。実際のクラスの外でそれを再現するためのコードをさらに取得しようとしています。