2016-07-06 70 views
1

我給下面的例子來說明我的問題:在C++中如何在同一個類對象內共享公共元素。

class A 
{ 
    public: 
     int common; 
     int a,b,c; 
     A(int _common, int _a, int _b, int _c):common(_common),a(_a),b(_b),c(_c) 
     { 

     } 
}; 
A obj1, obj2, obj3, obj4; 

class B 
{ 
    public: 
    void push_back(int common, int a, int b, int c) 
    { 
     A obj(common,a,b,c); 
     aObjArray.push_back(obj); 
     } 
    std::vector<A> aObjArray_; 

}; 


    B myObj; 
    int common=3; 
    myObj.push_back(common,1,2,4); 
    myObj.push_back(common,4,26,54); 
    myObj.push_back(common,7,52,64); 

在這個例子中,類B包含A類對象的陣列。創建一個對象由四個元素決定。預計類A中的common元素,其他元素對於每個生成的A對象都會有所不同。我能想到的一個解決方案是使common元素成爲靜態類成員,這樣幾個A類對象將共享相同的元素。

class A 
{ 
public: 
    static int common; 
    A (int _a, int _b, int _c) 
    {...} 

} 

class B 
{ 
public 
    int common; 
    B() 
    { 
     A::common = common; 

    } 

} 

還有其他想法嗎?

+0

所以,你想傳遞一個對象到讓我們說A類的第一個對象,並希望在A的其他實例中具有相同的值?我瞭解這是否正確? – Sossenbinder

+0

'std :: bind()'想到 – lorro

+0

@ Sossenbinder是的,這就是我所期望的。 – feelfree

回答

1

有很多方法可以實現這個目標,所以一個具體的例子可能會爲您提供更好的答案。


一種簡單的方法來簡化程序是引入一種可變進B類構建Acommon定義的值。具體來說,該值將在B::push_back中讀取,並且呼叫者只需要提供a,b,c


如果共同的價值在編譯時已知的,可考慮作類A一個template

template<int common> 
class A { 
public: 
    void foo() { 
    ...`common` available here... 
    } 
}; 

對於複雜的或突變的對象,你可以考慮使用一個共享指針。通常,這種複雜性可以(也應該)被避免。

1

也許共享指針會爲你做的伎倆?

#include <vector> 
#include <memory> 
#include <iostream> 

struct A { 
    std::shared_ptr<int> common; 
    int a, b, c; 
    void use_common() { 
     std::cout << *common << std::endl; 
    } 

}; 

int main() { 
    std::vector<A> va; 
    auto common = std::make_shared<int>(1); 
    va.push_back({common, 1, 2, 3}); 
    va.push_back({common, 4, 5, 6}); 
    va.push_back({common, 7, 8, 9}); 
    va[0].use_common(); 
} 
相關問題