c++ - 存储对类成员的引用。有什么好的解决办法吗?

标签 c++ encapsulation

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

背景

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

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

其中 trackcluster 具有类似 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/

相关文章:

c++ - 如何在不暴露使用的容器的情况下暴露迭代器?

c# - 为什么派生类无法从基类访问 protected getter?

c++ - 使用 ref-qualifiers 的重载决议

C++ 方法调用模板函数无法调用重载方法

python - 如何进行视频取景?

c++ - 为什么 Visual Studio 2012 中的 locals 和 autos 窗口为空?

c++ - 如何防止在其他智能指针中存储基于 intrusive_ptr 的类

entity-framework-4 - EF 代码优先 : How do I make a virtual collection private while still having it correctly create my database model?

perl - 为什么将 Perl OO 简单地用作数据封装技术?

javascript - 封装在 Javascript 中