У меня проблемы с инициализацией пары объектов. Я пишу программу, которая будет выполнять исследование границ для мобильного робота, используя Player / Stage simulation 2.0. У меня есть класс под названием Explorer. Объекты, с которыми я сталкиваюсь с трудностями при инициализации, — это робот, стр., Л.П. Я смотрю на справочную страницу в Интернете и полагаю, что это потому, что для этого нет оператора присваивания, но я надеюсь, что есть другой способ сделать это .;
Это мой заголовок
#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
robot
в Explorer
класс не является указателем, но вы пытаетесь инициализировать его с помощью new
ключевое слово:
robot = new PlayerClient("127.0.0.1", 6665); // this won't work
То же самое с переменной pp
,
Одно из замечаний об ошибке, которую вы получаете: примечание: кандидаты: PlayerCc :: Position2dProxy :: Position2dProxy (PlayerCc :: PlayerClient *, uint) также предположить, что конструктор нуждается в PlayerClient
указатель.
Попробуйте это в классе Explorer:
PlayerClient *robot;
И не забудьте сделать delete
это когда вы закончите с этим.
Простой способ обнаружить подобные ошибки — внимательно изучить сообщения об ошибках. Когда ошибка говорит ошибка: базовый операнд ‘->’ имеет тип без указателя это просто означает, что вы пытаетесь использовать оператор указателя ->
на то, что не является указателем.
Вместо того, чтобы менять членов вашего класса на указатели (что связано со своими сложностями), рассмотрите возможность инициализации членов, а не их назначения. Попробуйте Google в «Списке инициализаторов членов C ++» (этот результат может быть хорошим началом: http://www.cplusplus.com/forum/articles/17820/)
От ошибки это говорит candidates are: PlayerCc::Position2dProxy::Position2dProxy(PlayerCc::PlayerClient*, uint)
но вы проходите robot
который не объявлен как указатель. Вы объявили это как PlayerClient robot;
Тем не менее, вы используете robot
как указатель на объект.
Так что измени это PlayerClient *robot;
и эта ошибка должна быть устранена.