我在职业生涯中只使用Java编程,并且从10天开始使用C ++,所以这个问题对你们很多人来说可能都很奇怪。 我已经在头文件中定义了类的结构:
#include "ros/ros.h" #include "nav_msgs/Odometry.h" #include "geometry_msgs/Pose.h" #include "geometry_msgs/Point.h" #include "stdio.h" #include "sensor_msgs/LaserScan.h" #include "list" #include "vector" #include "scan_node.h" #include "odom_node.h" #include "coord.h" class stage_listener{ public: stage_listener(); private: std::list odom_list; std::list scan_list; std::list corners_list; std::list polar2cart(std::vector, float, float, float, float); void addOdomNode (const nav_msgs::Odometry); void addScanNode (const sensor_msgs::LaserScan); void extractCorners(std::vector, float, float, float, float); int distance (float, float, float, float, float); void nodes2text(std::vector, std::vector); int numOdom(); int numScan(); };
在关联的.cpp文件中,我写了一个main:
int main(int argc, char **argv){ char buffer [1024]; while(1){ int i = fscanf(stdin,"%s",buffer); if(strcmp("exit",buffer) == 0) exit(0); else if(strcmp("num_nodes",buffer) == 0){ ROS_INFO("Odometry nodes: %i\nScan nodes: %i",numOdom(),numScan()); } else{} } }
ROS_INFO函数是Willow Garage的ROS的一部分,您可以像普通的printf一样打算使用相同形式的参数。 在编译代码时,我得到以下内容:
/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp: In function ‘int main(int, char**)’: /home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:223:5: error: ‘numOdom’ was not declared in this scope /home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:223:5: error: ‘numScan’ was not declared in this scope
你知道错误的原因吗?在Java中,您可以访问私有字段/函数,因此我无法理解为什么在C ++中它不可能。
答案 0 :(得分:6)
在Java中,您可以访问私有字段/功能
不,你不能,除非你使用反射。这就是私有化的重点。我想你在这里混淆了公共和私人。 (你可以从类自己的main方法访问java中的私有静态字段和方法)。 C ++中的主要功能与类没有关联(即使它是,你的代码仍然无法工作,因为你试图静态访问实例成员)。
答案 1 :(得分:2)
通常,在C ++中,我们将这些函数用作公共函数。
你是私有的,所以只要在自己的班级范围内,你就可以访问它们。所以,如果yoy试图在主要部分使用它们,我们可以认为这些功能应该是公开的。
你需要声明一个类的对象。所以你可以使用object.function();来访问该函数。命令。
答案 2 :(得分:2)
这里有一些事情。
首先,您需要使stage_listener对象调用其方法或使方法为static,然后使用范围解析运算符调用函数,如果您希望对象共享相同的方法。 其次,您无法访问私有变量(这是OO语言中数据隐藏的重点。)
因此,您需要在类中公开函数,并创建类的对象或使函数静态,并使用范围解析运算符调用它们。完全取决于你想要完成什么。我希望这会有所帮助。
答案 3 :(得分:2)
1)你不能在没有实例化类的情况下调用方法,或者只是让你必须先创建对象。
2)即使您创建了类的对象,您的对象也无法调用私有方法。所以make numOdom和numScan是公共方法。
答案 4 :(得分:1)
您无法访问此类方法之外的任何私有方法(即使在Java中)。
将您想在外面使用的方法设置为公共
答案 5 :(得分:0)
在C ++中,main函数不是您定义的类的一部分(即使它是“在关联的.cpp文件中”),因此它无法访问私有字段。在C ++中,就像在Java中一样,只有在类中声明的函数才是类的一部分,因此可以访问私有字段。
答案 6 :(得分:0)
1)公共部门的公共方法
2)要调用类的非静态公共方法,首先要创建类的实例
class stage_listener{
public:
stage_listener()
{
}
//all methods are not implemented
void addOdomNode (const nav_msgs::Odometry) {}
void addScanNode (const sensor_msgs::LaserScan) {}
int numOdom() { return 0; }
int numScan() { return 0; }
private:
std::list<float> odom_list;
........
std::list<float> polar2cart(std::vector<float>, float, float, float, float)
{
//empty list
return std::list<float>();
}
........
};
int main(int argc, char **argv){
char buffer [1024];
while(1){
int i = fscanf(stdin,"%s",buffer);
if(strcmp("exit",buffer) == 0)
exit(0);
else if(strcmp("num_nodes",buffer) == 0){
//create object on the stack
stage_listener sl;
ROS_INFO("Odometry nodes: %i\n
Scan nodes: %i\n",
sl.numOdom(),
sl.numScan());
}
else{
return 1;
}
}
return 0;
}