получение пользовательского ввода в класс статически в C ++ - PullRequest
2 голосов
/ 28 марта 2012

У меня есть большой симулятор, написанный на C ++.Основным рабочим блоком для моделирования является класс, который представляет нейроны.Чтобы выполнить свои расчеты, каждому экземпляру класса нейронов необходим доступ к температуре.Каждое моделирование использует десятки тысяч экземпляров класса нейронов, и температура является одним и тем же значением для каждого нейрона.По этой причине я бы предпочел, чтобы он не хранился как данные обычного члена, поэтому каждый экземпляр класса нейронов не должен занимать память, хранящую свою собственную копию.В идеале я хотел бы хранить его как статическую переменную-член (или, в крайнем случае, глобальную переменную).Однако мне нужно, чтобы температура определялась во время выполнения как пользовательский ввод.Есть ли какой-нибудь простой способ предоставить классу neruon доступ к этой переменной в виде статических данных-членов?

Ответы [ 4 ]

1 голос
/ 28 марта 2012

То, что переменная является статической, не означает, что она также должна быть постоянной. См. Код ниже.

#include <cassert>

struct X {
    int member;
    static int static_var;
};

int X::static_var;

int main() {
    X x;
    x.member = 1;
    x.static_var = 2;

    X y;
    y.member = 3;
    y.static_var = 4;

    X::static_var = 5;

    assert(x.static_var == y.static_var);
    assert(&x.static_var == &y.static_var);
}
1 голос
/ 28 марта 2012

Просто предоставьте static функцию-член, которую вы можете вызвать во время выполнения и установить температурный элемент.
В качестве альтернативы, вы можете просто сделать static элемент public и установить его напрямую, как личный выбор.Я предпочитаю делать это через функцию-член.

class Neuron
{
    public:
        static void setTemperature(int i)
        {
            mTemp = i; 
        }

    private:
        static int mTemp;
};

int Neuron::mTemp = 0;


int main()
{
    //Get Temperature at run-time 
    Neuron::setTemperature(10);

    return 0;
}
0 голосов
/ 28 марта 2012

Синглтон, глобальные, статические данные, о боже!

Модель данных для C ++ позволяет нам иметь глобальный доступ к данным и ограничивать количество экземпляров этих данных с помощью различных механизмов и хаков.

То, что мы можем, не значит, что мы должны. И то, что у вас есть дизайн, в котором это может быть решением, не означает, что вы должны его выбрать.

Обычно у вас есть классы, которые управляют своими собственными данными. Если объекту нужны какие-то данные, которыми он не управляет, вы передаете его в качестве параметра.

Итак, передайте температуру как параметр. Явное лучше, чем неявное.

Вы упомянули, что у вас есть класс, представляющий Neurons. Я предполагаю, что вы имели в виду Neuron, но было бы также хорошо иметь класс Neurons, который объединит их всех. Он может иметь температуру, которая применяется ко всем Neuron вычислениям.

0 голосов
/ 28 марта 2012

Я вижу что-то вроде этого как хороший кандидат на глобальный.Что если вы добавите в симуляцию что-нибудь, в котором также используется температура?

Поскольку глобальная переменная может быть изменена кем-либо в любое время, я полагаю, что лучшим решением IMO является использование (стандартной) функции с глобальным охватом.как getTemperature().Тогда любой объект может вызвать его в любое время.Если поместить его в собственный файл C и пометить его как статический, доступ к нему будет возможен только через выбранный вами механизм.

Кроме того, если вам это не нравится, можно создать статический Globals или SimulationInputs класс, с геттерами для таких вещей, как температура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...