【问题标题】:how can I design a class with one variable and still work with different variables at the same time?如何设计一个具有一个变量的类,同时仍然使用不同的变量?
【发布时间】:2014-01-03 23:39:36
【问题描述】:

我有一个代码设计问题。

我构建了一个用于分析数据样本的类。它考虑样本并分析样本。例如,它可以计算样本均值和样本方差。因此,它在头文件中的最基本形式如下所示:

class Statistic{
public:
    // constructors
    Statistic();
    Statistic(vector<double> &s);

    // other functions
    double calcMean(void);
    double calcMean(vector<double> &s);
    double calcVariance(void);

private:
    vector<double> sample;
};

现在我想写一个函数calcCovariance 来计算两个样本之间的协方差。它的定义是这样的:

double calcCovariance(vector<double> &s1, vector<double> &s2);

但是,该类仅包含一个名为 sample 的私有变量。如何最好地设计我的类层次结构,使我的类只包含一个变量sample,并且我仍然可以同时处理多个样本?

提前致谢。

【问题讨论】:

  • 如果您的意思是希望您的私有 vector 变量可以从同一类的其他对象访问,您可以将其设置为受保护而不是私有。
  • 您可以公开您已经拥有的sample 变量。
  • 最好的设计是根本不使用类。
  • @LarsSorjetasek 我认为如果您尝试考虑您的课程代表什么,您可能会找到一个更好的解决方案(并且也许会理解为什么“不要在此处使用课程”的想法可能是一个好的解决方案) .从名字开始——问问自己,什么是统计数据?统计数据包含哪些信息?我可以对统计数据执行哪些操作?我想你会直观地发现,你程序中的“对象”实际上是样本数组,并且这些已经被向量很好地建模了。
  • @LarsSorjetasek 不过,没有理由多写一次。将这些相关函数放入它们自己的文件(utils 或其他文件)中,给它们一个命名空间并将它们包含在您需要的地方!恕我直言,您有时应该问是否有充分的理由 使用类 :-) 回到最初的问题,如果您坚持使用类,并且您使用的向量之一属于你调用方法的类,那么你只需要原型double calcCovariance(vector&lt;double&gt; &amp;otherSample)

标签: c++ class design-patterns class-hierarchy


【解决方案1】:

将函数放在类之外(我认为在讨论之后不需要这样做:-)),如果由于某种原因需要 Statistics 类,请提供 sample 的访问器,例如

namespace utilitystuff
{
    double calcCovariance(const vector<double> &s1, const vector<double> &s2)
    {
        //definition
    }
}

样品存取器:

const vector<double>& Statistics::getSample{return sample;}

然后这样称呼它:

//Assuming we have Statistics objects stats1 and stats2.
double covariance = utilitystuff::calcCovariance(stats1.getSample(), stats2.getSample());

【讨论】:

    【解决方案2】:

    定义你的类是这样的:

    class Statistic{
    public:
        // constructors
        Statistic();
        explicit Statistic(vector<double> &s);
    
        // other functions
        double calcMean(void) const;
        double calcVariance(void) const;
    
        double calcCovariance(const Statistic &other) const;
    
    private:
        vector<double> sample;
    };
    

    并实现类似的东西:

    double Statistic::calcCovariance(const Statistic &other) const
    {
    // TODO: use other.sample and sample here.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-05
      • 2017-02-14
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2011-08-31
      • 2017-06-30
      • 2014-09-10
      相关资源
      最近更新 更多