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