Как я могу создать класс с одной переменной и по-прежнему работать с разными переменными одновременно?

0

У меня вопрос проектирования кода.

Я создал класс, предназначенный для анализа выборки данных. Он рассматривает образец и анализирует образец. Например, он может вычислять выборочное среднее и выборочную дисперсию. Следовательно, в своей самой рудиментарной форме он выглядит так в заголовке:

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, и я все же могу работать с несколькими образцами одновременно?

Заранее спасибо.

  • 0
    Если вы хотите, чтобы ваша личная vector переменная была доступна из других объектов того же класса, вы можете сделать ее защищенной, а не частной.
  • 0
    Вы можете выставить sample переменной, которая у вас уже есть.
Показать ещё 24 комментария
Теги:
class
design-patterns
design
class-hierarchy

2 ответа

0
Лучший ответ

Поместите функцию вне класса (что, по вашему мнению, не требуется после обсуждения :-)), и если по какой-то причине требуется класс 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());
0

определите класс следующим образом:

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.
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню