2012-11-03 4 views
0

개체에 대한 포인터 배열을 통해 bject 메서드에 액세스하는 방법을 알아내는 데 어려움이 있습니다. 객체 I 내부 그래서개체에 대한 포인터 배열을 통해 개체 메서드에 액세스하는 C++

static Robot *robot; 
    static Obstacle *obstacle; 
    static Object **objects; 

:

Environment env; 

내 환경이 어떤 객체 포인터뿐만 아니라 동적 포인터의 배열을 가지고

나는 환경 클래스의 ENV 개체가 로봇과 장애물을 가질 수 있습니다 :

하지만 지금 내가 접근하고 싶을 때 개체 배열에있는 개체의 메서드를 어떻게 할 수 있습니까? 시도 :

Environment env; 
    Robot *robot; 

    robot = env.objects[0]; 
    robot->setSpeed(175); 

그러나 작동하지 않았습니다. 오류가 발생했습니다.

error: invalid conversion from ‘Object*’ to ‘Robot*’ 

무엇이 잘못 되었나요?

PS : Robot은 Object에서 상속됩니다.

미리 감사드립니다.

+1

'Robot'은'Object'에서 상속합니까? –

답변

4

: 난 당신이 dynamic_cast는를 사용하도록 조언 보조 노트로

robot = static_cast<Robot*>(Environment::objects[0]); 

을, 나 또한 사용하도록 권장 배열 대신 std::vector을 사용하고 원시 포인터 대신 std::shared_ptr과 같은 스마트 포인터를 사용합니다.

1

개체를 Object *에서 Robot *으로 캐스팅해야합니다. 그러나 Robot 객체인지 확인해야합니다. 그렇지 않으면 응용 프로그램이 중단됩니다. 여기

은 예입니다

#include <iostream> 
class Object 
{ 
}; 

class Robot : public Object 
{ 
    public: 
    int speed; 
    void setSpeed(int newSpeed){ speed = newSpeed; } 
}; 

int main() 
{ 
    Object* obj = new Robot(); 
    ((Robot*)obj)->setSpeed(4); 
    std::cout << "Speed is: " << ((Robot*)obj)->speed << std::endl; 
} 
+0

Ew-C 캐스트 ...! –

0

개체는 로봇 * 또는 그 서브 클래스에 대한 포인터 될 것 같지 않습니다.

2

개체 *를 로봇 *으로 캐스팅해야합니다. 로봇이 객체로부터 상속한다고 가정합니다. 당신이 static_cast 또는 dynamic_cast 포인터 캐스팅 중 하나를 사용할 필요가 Object에서 Robot 상속 때문에

Robot* robot = dynamic_cast<Robot*>(env.objects[0]); 
if (robot != NULL) { 
    robot->setSpeed(14); 
} 
1

파생 클래스의 포인터에 기본 클래스의 포인터를 암시 적으로 할당 할 수 없습니다. 이 작업을 수행하려면 dynamic_cast을 사용하십시오.

1

개체은 Object ** 유형으로 선언됩니다. 즉, 개체 [0]의 형식이 Object *입니다. Robot *에 Object *를 할당 할 수 없습니다. 로봇을 가정하면 Object에서 파생 된 클래스이며, 적어도 하나 개의 가상 멤버 함수를 가지고, 당신은이 캐스트를 수행합니다

robot = dynamic_cast<Robot*>(object[0]); 

을 할 수있는, 또는 개체 [0]에 무슨 일이 생기면 널 포인터 값으로 로봇 설정 로봇이 아니야.Robot이라는 것을 확실히 알고 있다면 static_cast()를 대신 사용할 수 있습니다.

관련 문제