2016-11-30 64 views
1

假设我有一个具有一些成员属性的类A, A也有一个带有B类对象的向量(std::vector<B>)。那些B对象需要一些属性(比如说5)。我看到了两种处理方法:C++类的设计:在其他类成员中共同使用类成员;小界面vs小班

1)让B引用这些属性,并在B的构造函数中赋值它们。

2)让B只有一个对象的引用,并通过公共getAttributeXYZ()函数获取属性。

我可以看到解决方案1)技术上对A的了解较少,因此它更好,因为它不能调用某个错误的函数。但我觉得2)更清晰,因为构造函数更小,B类本身具有更少的(引用)属性。有一个更好的方法,还是取决于细节?

上下文:在我的程序中,A的那些成员是可以由所有B对象共享的用于纹理管理,文本绘制等的类。

+1

我不遵循#1对A的了解程度的逻辑。如果它直接引用属性,它仍然依赖于A.事实上,它更是如此,因为它依赖于* private *实现A的细节,而如果你只是存储了一个对A的引用并且调用了public accessor函数,那么A和B之间的依赖关系就会减少。我还会争辩说,试图最小化两个*逻辑上依赖的事物之间的依赖关系是一个练习在愚蠢。使用最清晰的设计,即使它不是理论上最纯的设计。 –

+1

“有没有更好的方法还是取决于细节?”:我们如何知道细节而不知道? :)这就是为什么一个好问题应该被合成为[MCVE](http://stackoverflow.com/help/mcve),而不是一个普遍的问题 – wasthishelpful

回答

3

在这种情况下,您可以吃蛋糕,也可以将B仅限于A的相关子集。有很多方法可以解决这个问题。

一,聚集在一个专用的类属性:

struct A 
{ 
    struct SharedData 
    { 
    int data; 
    // ... 
    }; 

    A(); 

private: 
    SharedData sharedData; 
    std::vector<B> bs; 
    // other data here 
}; 

struct B 
{ 
    B(A::SharedData *data) : data{data} {} 

private: 
    A::SharedData *data; 
}; 

A::A() : bs{B{&sharedData}} {} 

两个,给A专用接口来访问这些属性:

struct SharedDataInterface 
{ 
    virtual int getData() const = 0; 
}; 

struct A : SharedDataInterface 
{ 
    int getData() override { return sharedData; } 

    A(); 

private: 
    std::vector<B> bs; 
    int sharedData; 
    // other data here 
}; 

struct B 
{ 
    B(SharedDataInterface *data) : data{data} {} 

private: 
    SharedDataInterface *data; 
}; 

A::A() : bs{B{this}} {} 

我对这个话题相信其他变化也是可能的。