Наследование и определение конструктора в C ++ - PullRequest
0 голосов
/ 27 мая 2018

У меня есть базовый класс и производный:

class Neuron 
{
    protected:
        double input;
        double output;
};

class InputNeuron : public Neuron
{
    public:
        InputNeuron();
};

Конструктор по умолчанию для производного класса определяется следующим образом:

InputNeuron::InputNeuron() : input(0.0), output(0.0) {}

Проблема заключается в следующем: Инициализация вводаи выходные данные являются ошибочными.

Моя цель здесь - получить выгоду от наследования, чтобы предотвратить повторное выделение входных и выходных данных в производных классах.Однако в текущем состоянии использование этих членов вызывает сообщение: input is not a nonstatic data member or base class of class InputNeuron, сообщение, от которого я не могу получить информацию.

1 Ответ

0 голосов
/ 27 мая 2018

Конструктор класса может только инициализировать (прямые) члены-данные класса;он не инициализирует члены данных базового класса.Вместо этого вам нужно использовать конструктор базового класса для этого.Сначала вам нужно будет определить соответствующий базовый конструктор.Если вы хотите, чтобы его использовали только производные классы, сделайте его protected:

class Neuron 
{
    protected:
        Neuron(double i, double o) : input(i), output(o) {}
    private:
        double input;
        double output;
};

class InputNeuron : public Neuron
{
    public:
        InputNeuron() : Neuron(0, 0) {}
        //              ^^^^^^^^^^^^
};

(Вы могли бы также сохранить элементы защищенных базовых данных и затем назначить для них в теле производных конструкторов, но это не очень хороший стиль, так как лучше сразу инициализировать переменные с их предполагаемым значением.)

...