2016-04-27 9 views
1

クラスAとクラスBの2つのクラスがあります。クラスAにはタイプmap<int,int>のマップがあります。クラスAではクラスBのクラスAの地図へのアクセス

、私は次の定義は、

typedef std::map<int, int> mymap; 

    mymap MYMAP; 

    A A_OBJ; 

    // did some insert operations on A_OBJ's MYMAP 

は、私は、クラスAに以下の機能を持っている必要があり、そのクラスBにコピーとしてAさんMYMAPを返しますBによって呼び出されたとき

A::mymap A::get_port(){ 

    // Returns A's map 
    return this -> MYMAP; 

} 
クラスBでは

void B::initialize_table(){ 

    A::mymap port_table = A_OBJ.get_port(); 

    cout<< "size of ports table at A is"<<port_table.size()); 

} 

コードはアウトですべての問題をまとめました。唯一の問題は、Aのマップにデータを挿入しても、Bは常にAのマップに0の要素があることを示しているということです。

私はを2秒ごとに呼び出すタイマーを持っています。それはAから地図の最新のコピーを入手することになっています。

何か助けていただければ幸いです。ありがとう。

+3

私たちに完全な作業プログラムを見せてください。 –

+0

'A :: mymap&port_table = A_OBJ.get_port();' – erip

+1

現在コンパイルされていないので、あなたのコードに何が問題なのかを見るのは難しいです。現在のところXY問題のように聞こえるので、MVCEの投稿を検討してください。 – erip

答えて

1

あなたは正しいstd::mapのコピーを作成していることを確認してください。これを修正する方法は、マップへの参照を初期化することです。

は、以下のスタブを検討:

#include <iostream> 
#include <map> 

using my_map = std::map<int, int>; 

struct A { 
    A() : m() {} 
    my_map& get_my_map() { return m; } 
    my_map m; 
}; 

struct B { 
    B() : a() {} 
    void initialize_map_ref(); 
    void initialize_map_val(); 
    void print_index_42() { std::cout << a.get_my_map()[42] << '\n'; } 
    A a; 
}; 

void B::initialize_map_ref() { 
    // notice this is a reference 
    my_map& m = a.get_my_map(); 
    m[42] = 43; 
} 

void B::initialize_map_val() { 
    // notice this is a copy 
    my_map m = a.get_my_map(); 
    m[42] = 43; 
} 

int main() { 
    B b; 
    b.initialize_map_ref(); 
    b.print_index_42(); 
    return 0; 
} 

B::initialize_map_ref基準を初期化する(すなわち、a内のマップを参照)B::initialize_map_valコピーを作成し、コピーを初期化し、。呼び出し後にコピーが消えるため、電話の外でm[42] == 0となります。一方、参照初期化は、基礎となるオブジェクトへの参照を変更したために継続されます。

考えられるもの:With referenceおよびwith value

+0

ありがとうございました!最後にそれを分かりました。私は既にそこにあったものの代わりに新しいオブジェクトにアクセスしていました。ポインタを使用しなければならなかった。 –

0

効率性のためにR値参照(つまり、A::mymap&& A::get_port(){return A::mymap(this -> MYMAP;) };)を返すことをお勧めします。

私はあなたのコードは、2つの状況のいずれかで失敗し見ることができます:あなたはA_OBJ.get_port() を呼び出した後

  • はあなたがこれはコピーが古いことになりますA_OBJ.MYMAPを更新しています。

  • またはA_OBJ.get_port()を更新しています。再度A_OBJ.get_port()を呼び出してください。これにより、コピーは変更されますが、元のマップは変更されずに残されます。その結果、A_OBJ.get_port()への2回目の呼び出しでは、前のマップから返された値の変更は考慮されません。

(const)参照をマップに戻したい場合があります。私は誤って

EDITはもともとA::mymap port_table = A_OBJ.get_port();は、2つのコピーを起こすだろうと思ったが、今私は、それはまた、右辺値の場合には、しかし、それは未定義の動作を導入する可能性があるということだろう、それはコピーして、移動の原因となります実現します(私は思う)一時的な参照を返すために...(元々私はreturn this -> MYMAPだったが、左辺値(this -> MYMAP)を右辺参照にバインドしようとするとエラーになる)

+0

私が知る限り、通常の左辺値参照は、クラスの移動セマンティクスを必要とせずに、左辺値参照として効率的になります。 – erip

+0

また、OPがマップを初期化しようとしているので、OPは明らかに 'const'参照を望まない。 – erip

+0

@erip actualy OPは明らかに 'A :: get_port'がコピーを返すと言いました。彼はまた、どこでどのように彼がマップを初期化したいのかを述べていませんでした(おそらくAのコンストラクタにあるはずです) – Isaac

関連する問題