2017-04-02 54 views
-1

我有權訪問工廠產生以如下方式對象:修改對象在容器無指針:矢量VS組

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; 
} 

當然,這並不改變該組中的對象的狀態。但在這裏我不能說

A & tmp = *result; 

這給了我:

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

我怎麼會用一個std::set實現這一目標?

+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

一個很好的問題。我不知道。這取決於它是如何實施的,並且沒有提供代碼。 –