Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有许多成员的班级的最佳实践 关于C++中组织一个班的成员(尤其是当有很多人)的最佳方法的任何意见。特别是,一个类有许多用户参数,例如,一个优化某些函数的类,它有许多参数,如迭代次数、优化步骤的大小、使用的具体方法、优化函数权重等。我尝试了几种通用方法,似乎总能找到一些不理想的方法。只是好奇别人的经历 类中的结构 类外的结构 公共成员变量 具有Set()和Get()函数的私有成员变量_C++_Parameters - Fatal编程技术网

有许多成员的班级的最佳实践 关于C++中组织一个班的成员(尤其是当有很多人)的最佳方法的任何意见。特别是,一个类有许多用户参数,例如,一个优化某些函数的类,它有许多参数,如迭代次数、优化步骤的大小、使用的具体方法、优化函数权重等。我尝试了几种通用方法,似乎总能找到一些不理想的方法。只是好奇别人的经历 类中的结构 类外的结构 公共成员变量 具有Set()和Get()函数的私有成员变量

有许多成员的班级的最佳实践 关于C++中组织一个班的成员(尤其是当有很多人)的最佳方法的任何意见。特别是,一个类有许多用户参数,例如,一个优化某些函数的类,它有许多参数,如迭代次数、优化步骤的大小、使用的具体方法、优化函数权重等。我尝试了几种通用方法,似乎总能找到一些不理想的方法。只是好奇别人的经历 类中的结构 类外的结构 公共成员变量 具有Set()和Get()函数的私有成员变量,c++,parameters,C++,Parameters,更具体地说,我正在处理的代码跟踪一系列图像中的对象。所以一个重要的方面是它需要在帧之间保持状态(为什么我不只是做一堆函数)。重要的成员函数包括initTrack()、trackFromLastFrame()、isTrackValid()。还有一系列用户参数(例如,每个跟踪的对象要跟踪多少个点,一个点可以在帧之间移动多少,使用的跟踪方法等等)这一切都取决于: 只有当您需要组织很多项时,内部结构才有用。如果是这样,你应该重新考虑你的设计 如果外部结构将与相同或不同类的其他实例共享,那么它将非常有用。

更具体地说,我正在处理的代码跟踪一系列图像中的对象。所以一个重要的方面是它需要在帧之间保持状态(为什么我不只是做一堆函数)。重要的成员函数包括initTrack()、trackFromLastFrame()、isTrackValid()。还有一系列用户参数(例如,每个跟踪的对象要跟踪多少个点,一个点可以在帧之间移动多少,使用的跟踪方法等等)

这一切都取决于:

  • 只有当您需要组织很多项时,内部结构才有用。如果是这样,你应该重新考虑你的设计
  • 如果外部结构将与相同或不同类的其他实例共享,那么它将非常有用。(模型或数据对象类/结构可能是一个很好的例子)
  • 仅适用于琐碎的一次性代码
  • 这是做事情的标准方式,但这完全取决于您将如何使用该类

  • 如果我必须从您列出的四个解决方案中选择一个:类中的私有类


    实际上:您可能有重复的代码,这些代码应该被重用,并且您的类应该被重新组织成更小、更具逻辑性和可重用的部分。正如GMan所说:重构代码

    我看不出使用单独的结构来保存参数有任何好处。该类已经是一个结构-如果通过结构传递参数是合适的,那么将类成员公开也是合适的


    在公共成员和Set/Get函数之间存在权衡。公共成员不是样板,但他们公开了类的内部工作。如果要从重构类时无法重构的代码中调用此函数,则几乎肯定要使用Get和Set。

    听起来这可能是模板的工作,就像您描述用法的方式一样

    template class FunctionOptimizer <typename FUNCTION, typename METHOD, 
        typename PARAMS>
    
    模板类函数优化器
    
    例如,
    PARAMS
    封装了简单的优化运行参数(#迭代次数等),而
    METHOD
    包含了实际的优化代码<代码>函数描述了优化目标的基本函数

    主要的一点并不是说这是最好的方法,而是如果你的类非常大,那么里面可能有一些较小的抽象,它们自然地可以重构成一个不那么单一的结构


    不管你如何处理这个问题,你不必一次重构所有的东西——从小事做起,逐段重构,并确保代码在每一步都有效。您会惊讶地发现,您很快对代码的感觉会好得多。

    假设配置选项仅适用于此类,请使用由具有有意义函数名的公共函数操纵的私有变量
    SetMaxInteriorAngle()
    SetMIA()
    SetParameter6()
    好得多。拥有getter和setter允许您在配置上强制执行一致性规则,并可用于补偿配置接口中的某些更改

    如果这些是常规设置,由多个类使用,那么最好是外部类,具有私有成员和适当的函数


    公共数据成员通常是个坏主意,因为它们公开了类的实现,使得它们之间不可能有任何保证关系。将它们隔离在单独的内部结构中似乎没有什么用处,尽管我会将它们分组到数据成员列表中,并用注释将它们隔开。

    如果你的类是大的,那么你的类是坏的。 一个班级应该尊重学生,也就是说:一个班级应该只做一件事,但应该把它做好。(好吧,“只有一个”是极端的,但它应该只有一个角色,并且必须明确实施)

    然后创建类,通过组合这些单一角色的小类来丰富这些类,每个类都有一个清晰而简单的角色

    大函数和大类是bug、误解和不必要的副作用的巢穴(尤其是在维护期间),因为没有人能在几分钟内学会700行代码


    因此,大类的策略是:重构、组合,小类只针对它们所做的事情。

    首先,我将成员分为两组:(1)仅用于内部的组,(2)用户将调整以控制类行为的组。第一个集合应该只是私有成员变量

    如果第二个集合很大(或者因为您仍在进行活动开发而不断增长和变化),那么您可以将它们放入它们自己的类或结构中。然后,主类将有两个方法,
    GetTrackingParameters
    SetTrackingParameters
    。构造函数将建立默认值。然后,用户可以调用
    GetTrackingParameters
    ,进行更改,然后调用
    SetTrackingParameters
    。现在,在添加或删除参数时,接口保持不变

    如果参数是简单且正交的,那么可以将它们包装在一个具有良好名称的公共成员的结构中。如果存在必须强制执行的约束,尤其是组合
    ObjectTracker tracker;  // invokes constructor which gets default params
    TrackerParams params = tracker.GetTrackingParameters();
    params.number_of_objects_to_track = 3;
    params.other_tracking_option = kHighestPrecision;
    tracker.SetTrackingParameters(params);
    // Now start tracking.