2013-05-06 3 views
0

У меня возникли проблемы с инициализацией нескольких объектов. Я пишу программу, которая будет выполнять исследование на основе границ для мобильного робота с использованием имитации 2.0 Player/Stage. У меня есть класс под названием Explorer. Объектам, с которыми я испытываю трудности с инициализацией, являются роботы, pp, lp. Я смотрю справочную страницу в Интернете, и я считаю, что это потому, что для этого нет оператора присваивания, но я надеюсь, что есть другой способ сделать это.Инициализация объектов и присвоение им переменных указателей

Это мой заголовок

#ifndef EXPLORER_H_ 
#define EXPLORER_H_ 
#include <libplayerc++/playerc++.h> 
#include <iostream> 
#include <fstream> 
#include <math.h>` 
#include <list> 
#include "Map.h" 

using namespace PlayerCc; 
using namespace std; 

struct Pose { 
double x; 
double y; 
double theta; 
}; 

struct Frontier { 
int startRow; 
int startCol; 
int endRow; 
int endCol; 
double score; 
}; 

class Explorer { 

public: 
Explorer(); 
void Explore(Map *map); 
void performLaserSweep(Map *map); 
void detectandgroupFrontiers(Map *map); 
Frontier score_pick_Frontier(); 
void goToFrontier(Frontier f); 

private: 
PlayerClient robot; 
Position2dProxy pp; 
LaserProxy *lp; 
Pose pose; 
list<Frontier> unexploredFrontiers; 
}; 

#endif /* EXPLORER_H_ */ 

это мой файл .cc все, что имеет значение конструктор, так что это все, что я хочу показать

#include "Explorer.h" 

Explorer::Explorer() { 

robot = new PlayerClient("127.0.0.1", 6665); 
pp = new Position2dProxy(robot, 0); 
lp = new LaserProxy(robot, 0); 
if (lp == NULL) { 
    cerr << "Error initializing LASER" << endl; 
    exit(1); 
} 
pp.SetMotorEnable(true); 
} 

Заранее спасибо за помощь

это ошибка компилятора

Explorer.cc: In constructor ‘Explorer::Explorer()’: 
Explorer.cc:11: error: no matching function for call to ‘PlayerCc::Position2dProxy::Position2dProxy()’ 
/usr/include/player-2.0/libplayerc++/playerc++.h:1566: note: candidates are: PlayerCc::Position2dProxy::Position2dProxy(PlayerCc::PlayerClient*, uint) 
/usr/include/player-2.0/libplayerc++/playerc++.h:1553: note:     PlayerCc::Position2dProxy::Position2dProxy(const PlayerCc::Position2dProxy&) 
Explorer.cc:13: error: base operand of ‘->’ has non-pointer type ‘PlayerCc::PlayerClient’ 
Explorer.cc:13: error: expected unqualified-id before ‘new’ 
Explorer.cc:13: error: expected ‘;’ before ‘new’ 
Explorer.cc:14: error: no matching function for call to ‘PlayerCc::Position2dProxy::Position2dProxy(PlayerCc::PlayerClient&, int)’ 
/usr/include/player-2.0/libplayerc++/playerc++.h:1566: note: candidates are: PlayerCc::Position2dProxy::Position2dProxy(PlayerCc::PlayerClient*, uint) 
/usr/include/player-2.0/libplayerc++/playerc++.h:1553: note:     PlayerCc::Position2dProxy::Position2dProxy(const PlayerCc::Position2dProxy&) 
Explorer.cc:15: error: no matching function for call to ‘PlayerCc::LaserProxy::LaserProxy(PlayerCc::PlayerClient&, int)’ 
/usr/include/player-2.0/libplayerc++/playerc++.h:900: note: candidates are: PlayerCc::LaserProxy::LaserProxy(PlayerCc::PlayerClient*, uint) 
/usr/include/player-2.0/libplayerc++/playerc++.h:881: note:     PlayerCc::LaserProxy::LaserProxy(const PlayerCc::LaserProxy&) 
make: *** [all] Error 1 

ответ

1

robot в Explorer классе не является указателем, а вы пытаетесь инициализировать его с new ключевого слова:

robot = new PlayerClient("127.0.0.1", 6665); // this won't work 

То же самое и с переменной pp.

Один из нот на ошибки вы получаете: примечание: кандидаты: PlayerCc :: Position2dProxy :: Position2dProxy (PlayerCc :: PlayerClient *, UINT) также предполагают, что конструктор нужен PlayerClient указатель.

Попробуйте это в классе Проводника:

PlayerClient *robot; 

И не забывайте делать delete, когда вы сделали с ним.

Простой способ обнаружения ошибок, подобных этим, внимательно рассматривает сообщения об ошибках. Когда ошибка говорит ошибка: базовый операнд '->' имеет не указательный тип, это просто означает, что вы пытаетесь использовать оператор указателя -> на том, что не является указателем.

+0

Вы также можете удалить «новое», если вы просто хотите его встроить. – Joel

+0

Спасибо, что это работает сейчас – jamalsabs

0

С ошибкой он сообщает candidates are: PlayerCc::Position2dProxy::Position2dProxy(PlayerCc::PlayerClient*, uint), но вы проходите мимо robot, который не объявлен как указатель. Вы указали это как PlayerClient robot; Однако вы используете robot в качестве указателя на объект.

Так что измените это на PlayerClient *robot;, и эту ошибку следует позаботиться.

1

Вместо того, чтобы менять членов вашего класса на указатели (которые имеют свои собственные сложности), рассмотрите возможность инициализации членов, а не назначение им. Попробуйте Google в «списке инициализаторов элементов C++» (этот результат может быть хорошим местом для начала: http://www.cplusplus.com/forum/articles/17820/)

Смежные вопросы