我正在尝试设计一个类来存储/访问/分析我的数据,但我不确定它们应该如何组合在一起。
我的(简化)数据采用“事件”的形式,可以这样表示:
//Representation of my data
class Event
{
private:
vector<track> tracks_;
vector<cluster> clusters_;
};
其中track
和cluster
具有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 );
}
}
答案 0 :(得分:1)
指向内部成员的指针可以,我的意思是封装是为了帮助你,而不是让你的生活更难。成堆的数据不像活动对象那样需要封装。当您拥有看起来/表现得像数据的东西时,以这种方式对待它们会很有效。思考:
Const指针优于const。 (不是const真的打破了包装)
您是否可以返回感兴趣的各方持有的价值对象,而不是参考/指针?
你的指针可能无效吗?例如,通过重新分配矢量?
你可以返回一个Event子类,它基本上包含一个向量索引,并且该事件提供了一个解码函数(这也有助于封装和指针失效)