2011-10-18 7 views
0

C++에서 s.t 인터페이스를 어떻게 선언 할 수 있습니까? 당신이거야 그럼인터페이스에 대한 해결 방법

class Enemy { 
public: 
    Enemy(); 
    virtual ~Enemy(); 
    virtual void doStuff() = 0; 
}; 

:

/** Enemy "Interface" */ 
Class Enemy { 
    Enemy(); 
    virtual ~Enemy(); 
    virtual void doStuff() = 0; 
}; 

/** Enemy of type 1 */ 
Class Enemy_type1 : public Enemy { 
    Enemy_type1(); 
    virtual ~Enemy_type1(); 
    virtual void doStuff() { 
     // different for every type of enemy 
    } 
}; 

/** Add an enemy to EnemyManager */ 
void EnemyManager::addEnemy(Enemy * e) { 
    this->enemies.push_back(*e); // declared as vector<Enemy> enemies; 
} 
+1

@see http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c – Nicoretti

+0

@ Kerrek SB 나는': public Enemy'를 추가하고 "c"를 변경했습니다. 알림을 보내 주셔서 감사합니다. 한 번에 여러 문제를 해결하기 때문에 답변을 수락하겠습니다. – Ben

+0

@ Nicoretti "인터페이스"(addEnemy 함수 참조)를 참조 할 수있는 방법이 나와 있지 않으므로이 문제가 어떻게 해결되는지 알지 못합니다. – Ben

답변

5

먼저 당신의 인터페이스 공개를 구성하는 기능을 당신이 (또는 적어도 원하는) 것, 아래 그림과 같이 나는 그것을 사용할 수 있습니다 (C++에는 별도의 개념으로 "인터페이스"와 "클래스"가 없습니다). 이러한 다형성 유형이기 때문에

class Emeny_type1 : public Enemy { 
    // ... 
}; 

마지막으로, 당신은 실제적인 적 객체로, 원수에 대한 포인터의 컬렉션을 만들 수 있습니다 :

void EnemyManager::addEnemy(Enemy const *e) { 
    enemies.push_back(e); 
} 

이 개체 수명의 문제를 제기하고 않습니다 소유권 (주로 Java에서는 문제가되지 않음) 아이템을 콜렉션에 추가 할 때 콜렉션을 사용하는 한 파괴되지 않도록해야하며, 콜렉션을 완료하면 파괴됩니다 (예 : 적을 물리 쳤을 때, 제거하고 싶을 수도 있습니다). EnemyManager가 더 이상 필요없는 적, 또는 다른 코드를 삭제할 것인지를 결정해야합니다. EnemyManager가 해당 항목을 삭제하려는 경우 Enemy 인터페이스에 clone 함수를 추가하여 컬렉션에 추가 할 개체의 복사본을 가져와야 할 수도 있습니다.

편집 : 귀하의 의견을 기반으로, 당신은 당신의 컬렉션에 저장된 포인터의 적 "인터페이스"를 사용하는 방법을 잘 모릅니다. 이 같은 다행히도, 그 상당히 간단 뭔가 :

for (int i=0; i<enemies.size(); i++) 
    enemies[i]->doStuff(); 
+0

나는 그가 "적"을 가치로 저장하고있는 것을보기 전에 4 번 그 질문을 읽었다. –

+0

오오 ... 나는 벡터 적을 써야만한다. 내가 계속 노력한 것은'벡터 * enemies;' – Ben

+0

'벡터 '을 원하지 않는다. (벡터가 이어야한다. 위의 코드에서'e'가 아닌'e'를 push하려고한다. –

0
/* Enemy Interface (Abstract Base Class) 
    This goes in a header, say Enemy.hpp 
*/ 
class Enemy { 
public: // note default access is private in classes 
    Enemy(); 
    virtual ~Enemy(); 
    virtual void doStuff() = 0; 
}; 

/* Add an enemy to EnemyManager. 
    The interface is a type, and is known! 
    It doesn't need to know anything about the subclasses 
    which implement the interface. 
*/ 
void EnemyManager::addEnemy(Enemy * e) { 
    this->enemies.push_back(*e); // vector of Enemy POINTERS 
} 

/* Enemy of type 1. 
    This would go in say Enemy1.hpp - it depends on Enemy.hpp, 
    but EnemyManager doesn't need to know anything about this. 
*/ 
Class Enemy_type1: public Enemy { 
public: 
    Enemy_type1(); 
    virtual ~Enemy_type1(); 
    virtual void doStuff(); 
}; 

/* ... and in a .cpp file somewhere ... */ 
Enemy_type1::Enemy_type1() : Enemy() 
{ 
    // this is redundant unless you have some work for it to do 
} 

Enemy_type1::~Enemy_type1() 
{ 
} 

void Enemy_type1::doStuff() 
{ 
    // do your stuff here 
} 
+0

고맙습니다.하지만 Jerry Coffin의 해결책은 제가 지금 이해하고 있으며 오류가 발생하지 않기 때문입니다. – Ben

+0

이것은 여전히 ​​적을 푸시합니다. b y 값, 주석에도 불구하고. –

+0

당신 말이 맞아요, 방금 그 비트를 붙여 넣고, 역 참조를 제거하는 것을 잊었습니다. – Useless

관련 문제