我正在尝试设计一组类来存储/访问/分析我的数据,但我不确定它们应该如何组合在一起。
背景
我的(简化的)数据是“事件”的形式,可以这样表示:
//Representation of my data
class Event
{
private:
vector<track> tracks_;
vector<cluster> clusters_;
};
其中 track
和 cluster
具有类似 get_track_time()
或 get_cluster_size()
的函数。
我有多种算法来选择“最佳”轨道和集群,我想将它们提供给更复杂的功能。我想存储这个选择,以便它只需为每个事件计算一次。
问题
如何存储“最佳”轨道?下面是我的代码在外部对象中存储对私有(private)成员的指针/引用。这打破了封装,但我不能在“事件”类中存储一个指针,因为在任何时候都可能有多个“最佳”定义。我是否只需要接受对私有(private)成员的指针/引用,还是有更好的安排方式?
我的代码
我正在考虑用函数对象来表示它们,结果是这样的:
//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 );
}
}
最佳答案
指向内部成员的指针可以,我的意思是封装可以帮助你,而不是让你的生活更难。成堆的数据不像事件对象那样需要封装。当您拥有看起来/行为像数据的东西时,以这种方式处理它们会很有效。想法:
Const 指针总比没有 const 好。 (不是 const 真的破坏了封装)
您能否返回由相关方持有的值对象,而不是 ref/pointer?
您的指针可能会失效吗?例如通过重新分配 vector ?
您可以返回一个 Event 子类,它基本上包含 vector 的索引,并且该 Event 提供解码函数(这也有助于封装和指针失效)
关于c++ - 存储对类成员的引用。有什么好的解决办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693410/