2017-04-02 4 views
-1

対ベクターは、私は次のようにオブジェクトを生成し、工場へのアクセスがあります。はポインタなしコンテナ内のオブジェクトを変更します。セット

A a = factory.build(); 

を、私は、コンテナ内のタイプAのオブジェクトを格納してアクセス、変更したいですそれらの内部状態と次のオブジェクトは、以前と同じオブジェクト(変更された状態)にアクセスしたいと思います。 私の最初の考えは、Aへのポインタをコンテナに格納することでした。しかし、上記のように、ファクトリはオブジェクトへのポインタではなく、オブジェクト自体を指しています。

クラスA:

class A 
{ 
    private: 
    int id; 

    public: 
    A(int id) 
    { 
     this->id = id; 
    } 

    int getId() const 
    { 
     return id; 
    } 

    void setId(int id) 
    { 
     this->id = id; 
    } 
}; 

私はvectorを使用して、次の作品ということを考え出し:

A obj1(1); 

std::vector<A> vec; 
vec.push_back(obj1); 

A & obj = vec[0]; 
obj.setId(4); 

for(std::vector<A>::iterator itr = vec.begin();itr!=vec.end();itr++) 
{ 
    std::cout << (*itr).getId() << endl; 
} 

これは修正IDを出力します。4.

std::setを使用して可能似たようですか?私は、次のことを試してみました:

もちろん
struct AComp 
{ 
    bool operator()(const A lhs, const A rhs) const 
    { 
    return (lhs.getId() < rhs.getId()); 
    } 
}; 

A obj2(1); 

std::set<A, AComp> mySet; 
mySet.insert(obj2); 

int id = 1; 
auto result = std::find_if(mySet.begin(), mySet.end(), [id](A a) {return a.getId() == id;}); 

A tmp = *result; 
tmp.setId(4); 
std::cout << tmp.getId() << endl; 

for(std::set<A>::iterator itr = mySet.begin(); itr!=mySet.end();itr++) 
{ 
    std::cout << (*itr).getId() << endl; 
} 

これがセットにオブジェクトの状態を変更しません。

binding ‘const hallo2::A’ to reference of type ‘hallo2::A&’ discards qualifiers 

どのように私はstd::setでこれを達成するであろう。しかし、ここで私は、これは私与え

A & tmp = *result; 

を言うことができませんか?

+1

セットに含まれるオブジェクトを変更できるかどうかを確認する場合は、答えは「いいえ」です。 –

答えて

1

*resultconst A&であるというエラーが表示されます。これは、この参照によってオブジェクトを変更できないことを意味します。

これは、セット内のオブジェクトを変更できないためです。本当にしたい場合は、オブジェクトを削除して再挿入する必要があります。

+0

ありがとうございます。 'vector'で許されている理由は何ですか?' set'では禁止されていますか? – efie

+1

ベクトル内の物の値を変更しても、ベクトル自体を無効にすることはできません。ほぼ常にバランスのとれたバイナリツリーとして実装されているセット内のものの値を変更すると、ツリーが無効になり、したがってセットが無効になります。 –

+0

ああ、意味があります。ありがとう! – efie

0

標準パターンを参照していると仮定する必要があるため、ファクトリクラスまたはビルドメソッドを提供していません。あなたが必要なのはこのような何かを行う必要があり、オブジェクトへのポインタである場合

しかし、:

APTR * A;

Aptr aptr = &(factory.build());

+0

しかし、 'factory.build()'のオブジェクトはヒープ上に作成されないので、 'factory.build()'のスコープを離れるときにこのオブジェクトが破壊されると、それは破壊されますか? – efie

+0

良い質問です。私は知らない。どのように実装され、コードが提供されていないかによって異なります。 –

関連する問題