首页 文章

C:从main访问私有字段和功能

提问于
浏览
4

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

7 回答

  • 2

    在Java中,您可以访问私有字段/功能

    不,你可以't, unless you'重新使用反射 . 那个's the entire point of making something private. I think you'在这里混淆了公共和私人 . (您可以从类自己的main方法访问java中的私有静态字段和方法) . C中的主要功能与类没有关联(即使它是,您的代码仍然不会尝试静态访问实例成员) .

  • 1

    这里有一些事情 .

    首先,您需要使stage_listener对象调用其方法或使方法静态,然后使用范围分辨率运算符来调用函数,如果您希望对象共享相同的方法 . 其次,您无法访问私有变量(这是OO语言中数据隐藏的重点 . )

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

  • 0

    通常,在C中,我们将函数用作公共函数 .

    你是私有的,所以只有在你自己的 class 范围内,你才能访问它们 . 所以,如果你们想要在主体中使用它们,我们可以认为这些功能应该是公开的 .

    你需要声明一个类的对象 . 所以你可以使用object.function();来访问该函数 . 命令 .

  • 0

    1)你不能在没有实例化类的情况下调用方法,或者只是让你必须先创建对象 .

    2)即使您创建了类的对象,您的对象也无法调用私有方法 . 所以制作numOdom和numScan公共方法 .

  • 2

    您不能访问此类方法之外的任何私有方法(即使在Java中) .

    将要在外部使用的方法设置为公共方法

  • 5

    在C中,main函数不是您定义的类的一部分(即使它是“在关联的.cpp文件中”),因此它无法访问私有字段 . 在C中,就像在Java中一样,只有在类中声明的函数才是类的一部分,因此可以访问私有字段 .

  • 2

    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;
        }
    

相关问题