Конструктор C++, Наследование, Модификаторы доступа и прочее

// Inheritance.cpp : main project file.
#include "stdafx.h"

using namespace System;

ref class Base {
private:
    int value;
    int value2;
    Base() { this->value2 = 4; }
protected:
    Base(int n) {
        Base(); // <- here is my problem
        value = n;
    }
    int get(){ return value; }
    int get2(){ return value2; }
};

ref class Derived : Base {
public:
    Derived(int n) : Base(n) { }
    void println(){
        Console::WriteLine(Convert::ToInt32(get()));
        Console::WriteLine(Convert::ToInt32(get2()));
    }
};

int main(array<System::String ^> ^args) {
    Derived ^obj = gcnew Derived(5);
    obj->println();
    Console::ReadLine();
}

Консольный вывод:

0
5

я знаю, что я вызываю конструктор Base(), и я знаю, что я создаю что-то вроде нового объекта, который исчезает после вызова Base(int n)...

но я понятия не имею, как я мог бы объединить свой частный конструктор по умолчанию с защищенным.

(Я использую.NET Framework через Visual-Studio-2010, но я думаю, что это больше похоже на общую проблему C++)

3 ответа

Решение

Когда я столкнулся с этой ситуацией, я добавил функцию-член для инициализации общих значений, как, например, метод Init, вызываемый для обоих конструкторов.

Использовать метод
назовите этот метод init(), например.

Base() конструктор уходит value неинициализирован, и я даже не уверен, что конструктор нужен вообще, так как это private,

Просто убедитесь, что вы правильно определяете свой публичный API и создаете только необходимые конструкторы. Затем в каждом конструкторе используйте список инициализатора для назначения всех атрибутов, чтобы избежать работы с неинициализированной памятью (обычно старайтесь избегать назначения в теле или отдельным методом, чтобы избежать возможной двойной инициализации.

Другие вопросы по тегам