C++:从main访问私有字段和函数

ubi*_*sum 4 c++ program-entry-point field private function

我在我的职业生涯中只用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++中它不可能.

Cub*_*bic 6

在Java中,您可以访问私有字段/函数

不,你不能,除非你使用反射.这就是私有化的重点.我认为你在这里混淆了公共和私人.(您可以从类自己的main方法访问java中的私有静态字段和方法).C++中的主要功能与类没有关联(即使它是,您的代码仍然无法工作,因为您试图静态访问实例成员).