std :: map按引用传递指向对象的指针

时间:2016-11-22 10:25:04

标签: c++ oop pass-by-reference ros stdmap

我正在为XPLANE10编写一个插件,从ROS中获取MSG。 我的IDE是基于QTcreator 4.1.0的基于QT 5.7.0的Ubuntu 64位。我想使用C ++ 11标准

我的代码解释

主要初始化ROS并创建地图 - >容器。 ROS循环旋转,直到我的GUI发送一个MSG,我的AirPlane应该飞行。

MSG包含3个浮点数(phi,theta,psi),其中“phi”是AirPlane ID,theta包含我的ETA的ID(预计到达时间) psi包含我姿势的ID所有ID都保存在ParameterServer(lookuptable)中。 所以在开始时我查找返回向量的activeAirplanes。我想将它们存储在一个映射中,其中键是AirCraft ID,第二个参数是Object的一个实例。

所以我初始化了例子(在调试时查看容器):

[0] first = 1 // Airplane ID1
[0] second = new CObject(freq)
[1] first = 2 // Airplane ID2
[1] second = new CObject(freq)

如果我从GUI获得MSG

phi = 1
theta=2
psi=3

, ROS将回调

MSG(....std::map<i32, CObject> &container)

//如果phi为1,那么使用mapkey 1并从CObject

触发方法do_stuff
do_stuff(phi, theta, psi,freq)

我想在main

中调用函数
int getPlanes(std::map<i32,CObject>& container)
{
...
getActiveAirplanesFromServer(activePlanes);
}

第一个问题: 如何将容器传递给我的回调?

第二个问题: 我如何并行化do_stuff()以便我的回调将返回main并且我可以命令更多的飞机而其他的计算机?

第三个问题: 如何通过引用传递容器的getPlanes的正确语法,以便getPlanes()可以编辑它?

第四个问题:

之间有区别吗?
std::map<i32,CObject*> map 
std::map<i32,CObject>* map

std::map<i32,CObject*>::iterator it=container->begin();
  std::map<i32,CObject*>::iterator* it=container->begin();

如果是,我想要什么? #4Solved

// I have to edit stuff 'cause of some restrictions in my company. 
#include "Header.h"
int main()

{
  f64 freq = 10;
  std::map<i32, CObject>* container;
  std::map<i32,CObject>::iterator* it=container->begin();


  // ROS
  if(!ros::isInitialized())
    {
      int    rosargc = 0;
      char** rosargv = NULL;
      ros::init(rosargc, rosargv, "MainNode");//), ros::init_options::AnonymousName);

    }
  else
    {
      printf("Ros has already been initialized.....\n");
    }
  ros::NodeHandle* mainNodeHandle=new ros::NodeHandle;
  ros::AsyncSpinner spinner(2);
  ParameterServer * ptrParam= new ParameterServer(mainNodeHandle);
  ros::Subscriber airSub=mainNodeHandle->subscribe<own_msgs::ownStruct>("/MSG",
                                                                             1000,
                                                                             boost::bind(MSG,
                                                                                         _1,
                                                                                         freq,
                                                                                         container));

  std::vector<i32> activePlanes;
  i32 retVal=0;
  retVal += ptrParam->  ParameterServer::getActiveAirplanesFromServer(activePlanes);
  if (retVal == 0 && activePlanes.size()>0)
    {

      for (u32 j =0; j <activePlanes.size(); j++)
        {

          container->insert (std::pair<i32,CObject> (activePlanes[j] , new CObject(freq)));


        }
    }

  while (ros::ok())
    {
      spinner.start(); //spinnt sehr viel :-)
      ros::waitForShutdown ();
    }
  std::cout<<"ENDE"<<std::endl;
  int retval = 1;
  return retval;
}

void MSG(const own_msgs::ownStruct<std::allocator<void> >::ConstPtr &guiMSG,
                                     f64 freq,
                                     std::map<i32, CObject> &container)
{



  if ((guiMSG->phi != 0) && (guiMSG->theta != 0) && (guiMSG->psi != 0))
    {
      std::string alpha = std::to_string(guiMSG->phi)+std::to_string(guiMSG->theta)+to_string(guiMSG->psi);    
    container.at(guiMSG->phi) -> do_stuff(guiMSG->phi,guiMSG->theta,guiMSG->psi, freq);
    }
  else
    {
      std::cout<<" Did not receive anything\n"<<endl;

    }

}


void do_stuff(...)
{
//copy the IDs to private Member of this single Object 
//setROS() for this single Object 
//callback the current AC pose via ID from XPLANE
//callback the wished AC pose via ID from ParamServer
// do some calculations for optimum flight path
// publish the Route to XPlane

}

EDIT :: 问题是我现在要编译它,如果调试它并在:

设置断点
void MSG(const own_msgs::ownStruct<std::allocator<void> >::ConstPtr &guiMSG,f64 freq,std::map<i32, CObject*> &container) 
{
..
/*->*/ container.at(guiMSG->)... 
}

Container仍为空。

1 个答案:

答案 0 :(得分:0)

所以我读了一些关于指针的东西,我看到了我的错误..

我困惑*和&amp; 如果我想传递一个变量的地址我必须像

一样写
int main()
{
int a = 0;
AddTwo(&a)
cout<<a<<endl; // Output: 2 
}
void AddTwo(int* a)
{
a+=2;
}