2012-11-03 86 views
0

我無法弄清楚如何通過指向對象的指針數組來訪問bject方法。C++通過指向對象的指針數組訪問對象方法

我有環境類的ENV對象:

Environment env; 

我的環境有一定的對象指針以及指針的動態數組:

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

所以裏面對象我可以有機器人和障礙物:

但現在當我想訪問在對象數組中的一個對象的方法,我該怎麼做?我試過

Environment env; 
    Robot *robot; 

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

但它沒有奏效。我遇到了一個錯誤:

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

我在做什麼錯?

PS:機器人從Object繼承。

預先感謝您!

+1

'Robot'是否繼承Object? –

回答

4

由於Robot繼承Object您可以選擇使用static_castdynamic_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

您需要將Object *強制轉換爲Robot *。假設機器人從Object繼承。我建議你使用的dynamic_cast:

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

您不能隱式地將基類的指針指派給派生類的指針。如果您需要這樣做,請使用dynamic_cast

1

對象用類型Object **聲明,這意味着對象[0]的類型爲Object *。您無法將對象*分配給機器人*。假設機器人是從對象派生的類和具有至少一個虛擬成員函數,可以執行

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

這將執行轉換,或機器人設置爲空指針值,如果對象[0]恰好不是機器人。如果您確定它是機器人,則可以使用static_cast()。

相關問題