왜 이렇게 할 수 없습니까?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
왜 이렇게 할 수 없습니까?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
답변:
의 멤버가 아니기 때문에 a및 bin을 초기화 할 수 없습니다 . 의 멤버 이므로 초기화 만 할 수 있습니다. 공개로 설정 한 다음에서 할당을 수행 할 수 있지만 캡슐화를 파괴 할 수 있으므로 권장되는 옵션이 아닙니다. 대신에 생성자를 생성하여 (또는의 모든 하위 클래스 ) 초기화 를 허용 합니다.BBAABABA
class A
{
protected:
A(int a, int b) : a(a), b(b) {} // Accessible to derived classes
// Change "protected" to "public" to allow others to instantiate A.
private:
int a, b; // Keep these variables private in A
};
class B : public A
{
public:
B() : A(0, 0) // Calls A's constructor, initializing a and b in A to 0.
{
}
};
a 와 b에 B::B()그들이 개인 때문이다. 의 멤버가 아니기 때문에 초기화 할 수 없습니다 class B. 당신이 그 (것)들을 공개 또는 보호 된 경우에 당신은 수 지정 의 몸을 B::B().
aand b..."라고 입력 하고 나머지 문장이 의미가 있는지 확인하지 않고 "You ca n't initialize ..."로 변경했습니다. 게시물이 수정되었습니다.
어쨌든 아무도 가장 간단한 방법을 나열하지 않았습니다.
class A
{
public:
int a, b;
};
class B : public A
{
B()
{
a = 0;
b = 0;
}
};
이니셜 라이저 목록의 기본 멤버에 액세스 할 수 없지만 다른 멤버 메서드와 마찬가지로 생성자 자체 가 기본 클래스의 public및 protected멤버에 액세스 할 수 있습니다 .
B가 할당 될 때 먼저 기본값으로 초기화 된 다음 B의 생성자 내부에 할당됩니다 . 그러나 컴파일러가 여전히 이것을 최적화 할 수 있다고 생각합니다.
class A우리는에 의존 할 수 a및 b초기화된다. class C : public A예를 들어 의 모든 구현은 호출하는 a=0;것을 잊고 a초기화되지 않은 상태로 둘 수 있습니다 .
class A { int a = 0;};) 또는 기본 클래스의 생성자에서 필드를 기본 초기화하는 것이 가장 좋습니다 . 서브 클래스는 필요에 따라 생성자에서 다시 초기화 할 수 있습니다.
# include<stdio.h>
# include<iostream>
# include<conio.h>
using namespace std;
class Base{
public:
Base(int i, float f, double d): i(i), f(f), d(d)
{
}
virtual void Show()=0;
protected:
int i;
float f;
double d;
};
class Derived: public Base{
public:
Derived(int i, float f, double d): Base( i, f, d)
{
}
void Show()
{
cout<< "int i = "<<i<<endl<<"float f = "<<f<<endl <<"double d = "<<d<<endl;
}
};
int main(){
Base * b = new Derived(10, 1.2, 3.89);
b->Show();
return 0;
}
Derived 클래스 생성자 호출을 통해 인터페이스하는 이러한 값을 푸시하려는 반면 Derived 클래스 개체에있는 Base 클래스 데이터 멤버를 초기화하려는 경우 작동하는 예제입니다.
이것은 드문 경우에 유용하지만 (그렇지 않았다면 언어가 직접 허용했을 것입니다), Base from Member idiom을 살펴보십시오 . 코드없는 솔루션이 아니며 상속 계층을 추가해야하지만 작업이 완료됩니다. 상용구 코드를 피하기 위해 boost 구현을 사용할 수 있습니다.