У меня есть вопрос дизайна кода.
Я построил класс, предназначенный для анализа выборки данных. Он рассматривает образец и анализирует образец. Например, он может вычислить среднее значение выборки и выборочную дисперсию. Следовательно, в самом простейшем виде это выглядит так в заголовочном файле:
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
, а я все еще могу работать с несколькими сэмплами одновременно?
Заранее спасибо.
Поместите функцию за пределы класса (что, я думаю, не требуется после обсуждения :-)), и если 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());
определите свой класс примерно так:
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.
}