存储对类成员的引用。有一个很好的解决方案吗?

时间:2013-12-19 23:03:59

标签: c++ encapsulation

我正在尝试设计一个类来存储/访问/分析我的数据,但我不确定它们应该如何组合在一起。

背景

我的(简化)数据采用“事件”的形式,可以这样表示:

//Representation of my data
class Event
{
private:
vector<track> tracks_;
vector<cluster> clusters_;
};

其中trackcluster具有get_track_time()get_cluster_size()等功能。

我有多种算法可以选择“最佳”音轨和群集,我想让它们用于更复杂的功能。我想存储这个选择,以便它只需要为每个事件计算一次。

问题

如何存储“最佳”曲目?下面是我的代码,存储指向外部对象中私有成员的指针/引用。这打破了封装,但是我不能在'Event'类中存储指针,因为在任何时候都可能存在多个“best”的定义。我是否必须接受私人成员的指针/引用,或者有更好的方法来安排事情吗?

我的代码

我正在考虑用函数对象表示它们,结果如下:

//Interface for selecting a particular track
class BestTrack
{
public:
virtual void new_event(const Event& e) = 0;
virtual const& track get_track(const Event& e) = 0;
virtual ~BestTrack();
    };

//Sample implementation of track selection
class ABestTrack : public BestTrack
    {
    public:
    void new_event(const Event& e )
        { ..implementation sets cached_track... }

    const& track get_track()
    { return *cached_track; }


private:
track * cached_track; //I think this would have to be a pointer not a reference
};

将由我的分析对象使用:

//Some complicated analysis object
class MyAnalysis
{
public:
MyAnalysis( BestTrack * bt );
void DoAnalysis( const Event& e )
{
//get the best track
auto best_track  = bt( e );
...implementation...
}
private:
BestTrack* bt;
};

所以最后我可以做到

int main()
{

//Create all my "best" selection algorithms
ABestTrack a_best_track;
BBestTrack b_best_track;
CBestCluster c_best_cluster;
DBestCluster d_best_cluster;

//Mix and match algorithms
MyAnalysis analysis_1( &a_best_track, &d_best_cluster );
MyAnalysis analysis_2( &b_best_track, &c_best_cluster );


  //In reality the rest of this would be in a loop
for ( something )
{
    const Event event;
    a_best_track.new_event( event);
    b_best_track.new_event( event);
    c_best_cluster.new_event( event);
    d_best_cluster.new_event( event);


    //Each analysis gets a reference to it's own definition of the "best" track
    analysis_1.DoAnalysis( event );
    analysis_2.DoAnalysis( event );

}
}

1 个答案:

答案 0 :(得分:1)

指向内部成员的指针可以,我的意思是封装是为了帮助你,而不是让你的生活更难。成堆的数据不像活动对象那样需要封装。当您拥有看起来/表现得像数据的东西时,以这种方式对待它们会很有效。思考:

  • Const指针优于const。 (不是const真的打破了包装)

  • 您是否可以返回感兴趣的各方持有的价值对象,而不是参考/指针?

  • 你的指针可能无效吗?例如,通过重新分配矢量?

  • 你可以返回一个Event子类,它基本上包含一个向量索引,并且该事件提供了一个解码函数(这也有助于封装和指针失效)