C++;:从main访问私有字段和函数 我在我的职业生涯中只使用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(); }; #包括“ros/ros.h” #包括“导航/里程计.h” #包括“几何体/Pose.h” #包括“几何图形\u msgs/Point.h” #包括“stdio.h” #包括“传感器/激光扫描.h” #包括“列表” #包括“向量” #包括“扫描节点.h” #包括“odom_node.h” #包括“coord.h” 类后台监听器{ 公众: stage_listener(); 私人: std::列表odom_列表; 标准:列表扫描列表; std::列表/列表; std::list polar2cart(std::vector,float,float,float,float); void addOdomNode(常数导航:里程计); void addScanNode(常数传感器:激光扫描); 虚空提取角点(标准::向量,浮点,浮点,浮点,浮点); 整数距离(浮点,浮点,浮点,浮点,浮点); void nodes2text(std::vector,std::vector); int numOdom(); int numScan(); };

C++;:从main访问私有字段和函数 我在我的职业生涯中只使用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(); }; #包括“ros/ros.h” #包括“导航/里程计.h” #包括“几何体/Pose.h” #包括“几何图形\u msgs/Point.h” #包括“stdio.h” #包括“传感器/激光扫描.h” #包括“列表” #包括“向量” #包括“扫描节点.h” #包括“odom_node.h” #包括“coord.h” 类后台监听器{ 公众: stage_listener(); 私人: std::列表odom_列表; 标准:列表扫描列表; std::列表/列表; std::list polar2cart(std::vector,float,float,float,float); void addOdomNode(常数导航:里程计); void addScanNode(常数传感器:激光扫描); 虚空提取角点(标准::向量,浮点,浮点,浮点,浮点); 整数距离(浮点,浮点,浮点,浮点,浮点); void nodes2text(std::vector,std::vector); int numOdom(); int numScan(); };,c++,function,field,private,main,C++,Function,Field,Private,Main,在关联的.cpp文件中,我编写了一个主文件: int main(int argc, char **argv){ char buffer [1024]; while(1){ int i = fscanf(stdin,"%s",buffer); if(strcmp("exit",buffer) == 0) exit(0);

在关联的.cpp文件中,我编写了一个主文件:

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{} } } int main(int argc,字符**argv){ 字符缓冲区[1024]; 而(1){ int i=fscanf(标准输入,“%s”,缓冲区); 如果(strcmp(“退出”,缓冲区)==0) 出口(0); else if(strcmp(“num_节点”,缓冲区)==0){ ROS_信息(“里程计节点:%i\n扫描节点:%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 /home/ubisum/fuerte_workspace/初学者/src/stage_listener.cpp:在函数“int main(int,char**)”中: /home/ubisum/fuerte_workspace/初学者/src/stage_监听器。cpp:223:5:错误:“numOdom”未在此范围内声明 /home/ubisum/fuerte_workspace/初学者/src/stage_侦听器。cpp:223:5:错误:未在此范围内声明“numScan” 你知道错误的原因吗?在爪哇,您可以访问私有字段/函数,因此我无法理解C++中为什么不可能的原因。p> 在Java中,您可以访问私有字段/函数


不,你不能,除非你使用反射。这就是为什么要把事情保密。我觉得你把公共和私人都搞混了。(您可以从类自己的主方法访问java中的私有静态字段和方法)。C++中的主要功能与类无关(即使是,因为您试图静态访问实例成员),否则代码仍然不能工作。

通常,在C++中,我们使用函数作为公共。p> 您是作为私有的,所以您可以在自己的类的范围内访问它们。所以,如果你想主要使用它们,我们可以认为这些函数应该是公共的


您需要声明类的一个对象。因此,您可以使用object.function()访问该函数;命令。

C++中,main函数不是定义的类的一部分(即使它是在关联的.CPP文件中),所以它不能访问私有字段。在C++中,与java一样,只有在类中声明的函数是类的一部分,所以可以访问私有字段。

您不能访问任何此类方法之外的私有方法(即使在爪哇)。p>
将您想在外部使用的方法设置为公共的

这里有一些东西

首先,您需要使stage_listener对象调用其方法或使方法静态,然后如果您希望对象共享同一方法,则使用scope resolution操作符调用函数。 其次,您不能访问私有变量(这是OO语言中隐藏数据的要点)

因此,您需要在类中公开函数,或者创建类的对象,或者使函数成为静态函数,并使用范围解析操作符调用它们。这完全取决于你想要完成什么。我希望这会有所帮助。

1)如果不实例化类,就不能调用方法,或者简单地说,必须先创建对象

2) 即使创建类的对象,对象也不能调用私有方法。因此,让numOdom和numScan成为公共方法。

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;
    }
class-stage\u侦听器{
公众:
舞台监听器()
{
}
//并不是所有的方法都被实现
void addOdomNode(const nav_msgs::里程计){}
void addScanNode(常数传感器\ msgs::激光扫描){}
int numOdom(){return 0;}
int numScan(){return 0;}
私人:
std::列表odom_列表;
........
std::list polar2cart(std::vector,float,float,float,float)
{
//空列表
返回std::list();
}
........
};  
int main(int argc,字符**argv){
字符缓冲区[1024];
而(1){
int i=fscanf(标准输入,“%s”,缓冲区);
如果(strcmp(“退出”,缓冲区)==0)
出口(0);
else if(strcmp(“num_节点”,缓冲区)==0){
//在堆栈上创建对象
舞台;
ROS\u信息(“里程计节点:%i\n
扫描节点:%i\n“,
sl.numOdom(),
sl.numScan());
}
否则{
返回1;
}
}
返回0;
}

在使用函数之前,您必须在主文件中包含标题并创建一个对象(函数必须是公共的,才能在类外使用)。洛杉矶