2016-07-06 54 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(); 
} 
相关问题