2016-07-06 17 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オブジェクトの配列が含まれています。オブジェクトの作成は4つの要素で決まります。クラスAのcommon要素があると予想されますが、他の要素は生成されるAオブジェクトごとに異なります。私が考えることのできる1つの解決策は、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の最初のオブジェクトを1つのオブジェクトに渡して、Aの他のインスタンスに同じ値を持たせたいとしますか?私はそれが正しいことを理解しましたか? – Sossenbinder

+0

'std :: bind()'は – lorro

+0

@ Sossenbinderはいです。これは私が期待しているものです。 – feelfree

答えて

1

これを達成するには多くの方法があります。具体的な例では、より良い回答が得られる可能性があります。あなたのプログラムを簡素化する


一つの簡単な方法は、Aを構築するときcommonの値を定義するクラスBに変数を導入することです。具体的には、この値はB::push_backで読み込まれ、発信者はa,b,cを提供するだけです。複雑なまたは変異オブジェクトの場合

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

、共有ポインタを使用して検討するかもしれない:共通の値はコンパイル時に知られている場合は、クラスAtemplateを行うことを検討することができます


。通常、その複雑さは避けることができます。

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(); 
} 
関連する問題