2011-02-24 9 views
1
// 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(); 
} 

콘솔 출력은 다음과 같습니다C++ 생성자, 상속, 액세스 수정 및 재료

0 
5 

나는 기본() 생성자를 호출 할 것을 알고, 나는 새로운 객체 같은 것을 만드는 것을 알고있다 Base (int n)가 호출 된 후에 사라지는 ...

그러나 나는 개인 기본 생성자와 보호 된 개체를 어떻게 조합 할 수 있는지 잘 모릅니다.

(난 비주얼 스튜디오 2010를 통해 .NET 프레임 워크를 사용하고,하지만 난이 더 일반적인 C++ 문제처럼 생각)

+1

C++에서는 생성자를 호출 할 수 없습니다 생성자에서 : http://stackoverflow.com/questions/308276/c-call-constructor-from-constructor – birryree

+0

링크를 사용해 주셔서 감사합니다. – Baarn

+1

@birryee : 확실히 할 수 있습니다. 다른 개체에 대한 현재 개체의 생성 –

답변

2

나는 일반적인 값을 초기화 멤버 함수를 추가 이러한 상황에 직면 할 때, 예를 들어 두 생성자 모두에서 호출되는 Init 메소드가 있습니다.

+0

아, 내 질문에 대한 첫 번째 주석을 볼 때 가장 좋은 방법 인 것 같습니다. – Baarn

2

사용 방법
이름이 방법은 init()입니다.

0

Base() 생성자는 value을 초기화하지 않고, 생성자가 전혀 필요하지 않다는 것을 확신하지 못합니다. private입니다.

공개 API를 적절하게 정의하고 필요한 생성자 만 만들면됩니다. 그런 다음 각 생성자에서 이니셜 라이저 목록을 사용하여 모든 속성을 할당하여 초기화되지 않은 메모리로 작업하지 않도록하십시오 (일반적으로 본문에서 할당을 피하려고하거나 이중 초기화를 피하기 위해 별도의 메서드를 사용하지 마십시오.)

+0

Base()의 목적은 다음과 같습니다. 가치 2를 설정하는 것이 었습니다. 유일한 목적은 t이기 때문에 비공개입니다. o이 경우 Base (int n)와 같은 클래스의 다른 생성자 만 호출 할 수 있습니다. 슬프게도 불가능합니다. – Baarn