Конструктор 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, вызываемый для обоих конструкторов.
Base()
конструктор уходит value
неинициализирован, и я даже не уверен, что конструктор нужен вообще, так как это private
,
Просто убедитесь, что вы правильно определяете свой публичный API и создаете только необходимые конструкторы. Затем в каждом конструкторе используйте список инициализатора для назначения всех атрибутов, чтобы избежать работы с неинициализированной памятью (обычно старайтесь избегать назначения в теле или отдельным методом, чтобы избежать возможной двойной инициализации.