Конструктор C ++, Наследование, Модификаторы доступа и прочее - PullRequest
1 голос
/ 24 февраля 2011
// 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, но я думаю, что это больше похоже на общую проблему с ++)

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

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

2 голосов
/ 24 февраля 2011

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

0 голосов
/ 24 февраля 2011

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

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

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