지금까지 C#의 추상메소드 개념인줄
생성자 호출될때 초기화 편하게 하려고 <밑의 소스 C#> 구현해놓고 요 개념 그대로 C++로 구현하려니 구현이 안됨.
그래서 템플릿으로 초기화하는 방법으로 쫘놨더니
꼰대 상사한테 C#때문에 버릇 나빠진다는 소리도 들음 시벌 ㅋㅋㅋㅋㅋㅋㅋㅋ
//C++ 얜 안되서 템플릿으로 뺌
class A
{
public :
A()
{
InitCallback(); <= 구현체가 없어서 안됨.
}
virtual void InitCallback() = 0;
};
class CppB : public A
{
public :
void InitCallback() override;
public :
template <class T>
static T* NewCreate();
};
template <class T>
inline T* CppB::NewCreate()
{
T* obj = new T();
obj->InitCallback();
return obj;
}
void CppB::InitCallback()
{
printf("TESt");
}
//C# 얜 원래 돼!
public abstract class B
{
public B()
{
Foo();
}
protected abstract void Foo();
}
class C : B
{
protected override void Foo()
{
//override 된 함수 Init이라면 Init 자동 호출
}
}
에효.. new 쓰지 마라 - return 0;
자네의 실력이 꼰대를 운운한 실력이 아닌것 같구만 허허ㅓ
ㄴㄴ현재 회사 개발환경 vs2010이 이상하게 스마트 포인터는 지원하는데 make 는 안보인단 말이지.
나도 abstract 를 java의 interface 처럼 사용하는 입장에서, interface를 완전히 대체할수 없음. 이유는 c++의 다중상속 문제때문임. 제한적으로 layer를 구별해야할때만 어쩔수 없이씀.
그리고 위 코드의 접근방식은 솔직히 좋게 평가하기힘듬. 템플릿 자체가 가독성이나, 디버깅이 매우 힘든데다가, c++생성자가 어떻게 불리는지 확인해보면 불필요하다고 생각될거임. 불필요하다는것은 저 템플릿이 편하지 않다는 의미임
ㄴ흠.. 그럼 객체가 생성될때 override 된 함수를 자동으로 호출 하게 하려면 뭐가 좋을까?
저런 클래스가 여러개 되면 결국엔 C++ 은 A a; a.Init(); for문 쓰지 않는 조건에선 뭐 이런식으로 계속 써야하잖아?
생성자에 virtual function인 init을 호출하도록 작성
ㄴ내가 말을 잘못했구만 상속 받을때마다 써줘야한다는 소리지...
상속받을떄마다 안써도됨 최상위 클래스에서 한번만 쓰면됨
순수가상함수 말고 가상함수를 쓰면 생성자에서 호출은 되겠지. 인터페이스나 추상 메소드 처럼 상속받은 자식클래스가 반드시 구현하게 끔 하고 싶은거지
즉 부모클래스를 상속받은 애는 그냥 클래스만 생성하면 오버라이드를 해야하는 특정함수가 콜되서 초기화 되는걸 원하는거지
앞서 말했다 시피 c++ 에서 순수가상함수라는게 interface와 1대1 매치안됨. 어차피 오버라이딩 안된 function이 있으면 object 생성안됨. 순수가상함수 생성자에 코드를 넣어도 달라질건 없음. 저의 예제 코드도 A 클래스 생성자에 코드가 들어있음. 차분히 자신의 코드를 살펴보길바람. 저 A클래스에 코드가 들어있음
오탈자 A클래스 -> B클래스
C# 쪽 코드를 C++로 옮기면 이런 형태가 되겠지? class IBaseCallback{public: IBaseCallback(void){ InitCallback() } ~IBaseCallback(void){} virtual void InitCallback() = 0;protected :};class ICallback : public IBaseCallback{public :void InitCallback override;}
C#은 돼. 이 개념을 c++ 적용하니 c++ 은 순수가상함수 구현체가 없어서 빌드가 안됨. 그래서 템플릿으로 뺀 것이지
C++ 내용변경해서 다시 올려놨음.