2015-01-14 7 views
1

파생 클래스 자체를 모른 채 파생 클래스 함수를 호출하는 상위 클래스로 소프트웨어를 작성하려고합니다. 나는 진짜 해결책에 도달하지 않고 그것에 대해 생각 해왔다. 부모 클래스를 사용하여 코드를 실행하려면 파생 클래스에서 포인터를 가져와야한다고 생각합니다.파생 클래스를 모른 채 상위 클래스의 파생 클래스 함수 호출

나는 순수 가상 함수와 부모 클래스가 있습니다

는 여기에 내가 무엇을 달성하고자합니다. 파생 클래스는 상기 함수를 구현할 것이다. 부모 클래스는 (벡터를 사용하여) 파생 클래스 함수의 코드를 실행하는 정적 함수도 갖습니다.

class Base { 

    static std::vector<Base*> vec; 

public: 

    virtual void Test() = 0; 
    static void Func(); 
}; 

class Derived : public Base { 
public: 
    void Test() 
    { 
     std::cout<<"hello"; 
    } 
}; 

void Base::Func() 
{ 
    for (int i = 0; i != vec.size(), i++) 
    { 
     vec[i]->Test(); 
    } 
} 

문제는 다음과 같습니다. 모든 파생 클래스에서 "Test()"함수를 호출해야합니다. 하지만 내가 다른 파생 클래스가

예를 생성됩니다 무엇인지 때문에 프로그램 수행해야합니다 :

//Base.h 
class Base { 

     static std::vector<Base*> vec; 

    public: 

     virtual void Test() = 0; 
     static void Func(); 
}; 


//Base.cpp 
void Base::Func() 
{ 
    for (int i = 0; i != vec.size(), i++) 
    { 
     vec[i]->Test(); 
    } 
} 

내 자료 : Func을()를 어떤 프레임에서 호출 될 것입니다. 이 점은 "사용자"에서

는 다음과 같이, 자신의 구현 및 헤더 파일을 만들 것입니다 :

//Derived.h 
class Derived : public Base { 
public: 
    void Test() override; 
}; 

//Derived.cpp 

void Derived::Test() 
{ 
    //Insert code here 
} 

감사합니다 사전에 어떤 도움을.

추신 : 저는 게임 엔진의 업데이트 방법과 같은 것이 필요할 것입니다. Cocos2d 업데이트 방법과 같습니다.

+3

무엇이 질문입니까? (이것은 당신이 설명한대로 작동해야합니다) –

+0

문제는 : 모든 파생 클래스에서 "Test()"함수를 호출해야합니다. 하지만 다른 파생 클래스가 만들어 질지 모르기 때문에 프로그래밍 방식으로 수행해야합니다. –

+0

당신의 솔루션은 완벽합니다. 바로 가상이 만든 것입니다. 너 해봤 니? – Wolf

답변

-1

CRTP (기이하게 반복되는 템플릿 패턴)의 유스 케이스처럼 보입니다. 의 우리가 유형 Tthis 개체를 캐스팅하고 해당 유형의 각 함수를 호출하고, 유형 당신은 여기에서 무엇 T

template<typename T> 
struct Base 
{ 
    void Fun() 
    { 
     ((T*)this)->Fun(); 
    } 
} 

에서 템플릿 기반을 가지고 있다고 가정 해 봅시다. 이게 어디에서 도움이됩니까? 그 클래스에서 상속 상상 만하면 (예이 법적) 당신의 유형 밑에을 템플리트

struct Derived : Base<Derived> 
{ 
    void Fun(); 
} 

은 "파생 클래스를 모른 채 부모 클래스에서 파생 된 클래스 함수를 호출"수있는이 방법은 유도가를 구현하는 제공 베이스에 의해 "예측 된"인터페이스. 예를 들어, 누군가가 당신이 기능을 구현하는 클래스를 파생해야하는 경우이

Base<Derived2> obj; 
obj.Fun(); // calls Fun of the derived object 
+0

답변 해 주셔서 감사합니다. 틀렸나요? 객체를 만들지 않으면 작동하지 않습니까? –

+0

@ user3772833 그럴 수 있습니다. 그것은 유형의 속성입니다. 실행 중에는 디스패치가 처리되지만 예상대로 형질 쿼리가 작동합니다. –

+0

개체를 만들지 않고 예제를 보여 주시겠습니까? 감사합니다 –

0

과 같은 코드를 작성할 수 Derived2 새로운 클래스를 정의하면, 객체 않고 당신이 원하는 방식으로 호출 할 수있는 방법이 없습니다. 코드가하는로의 벡터로, 그러나, 그것은 간단하다

#include <iostream> 
#include <vector> 

using namespace std; 

namespace game{ 

class base{ 
    void add_to_vec(base* b); 
    public: 
    base(){add_to_vec(this);} 
    virtual void test()=0; 
    static void testAll(); 
}; 

static vector<base*> vec; 

void base::add_to_vec(base* b){vec.push_back(b);} 

void base::testAll() 
{ 
    for (int i = 0; i != vec.size(); i++) 
    { 
    vec[i]->test(); 
    } 
} 

} 

class derived1 : public game::base{ 
    public: 
    void test() {cout << "Derived 1" << endl;} 
}; 

class derived2 : public game::base{ 
    public: 
    void test() {cout << "Derived 2" << endl;} 
}; 

int main(){ 
    derived1 a; 
    derived2 b; 
    game::base::testAll(); 
} 

이 단순화하기 위해, 내가 벡터에서 개체를 제거하기위한 코드를 ommitted, 마녀 당신도 아주 쉽게 파악한다.

+0

이것에 감사드립니다, 그것은 내가하는 것처럼입니다. 나는 게임 엔진을 Cocos2d가 객체를 만들지 않고 업데이트 기능을 호출 할 수있는 방법을 궁금해하고 있는데, 이는 내가 성취하고자하는 것이고, 그렇게하지 못하는 해결책을 찾지 못해서 많은 어려움을 겪어왔다. 객체 생성 –

관련 문제