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

C++: accessing private fields and function from main

在我的职业生涯中,我只用Java编程,从10天开始使用C++,所以这个问题对你们中的许多人来说可能很奇怪。我在头文件中定义了类的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    #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文件中,我编写了一个主文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    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
Scan nodes: %i"
,numOdom(),numScan());
                }

                else{}
            }

    }

ros-info函数是willow-garage的ros的一部分,您可以像普通的printf一样使用它,并以相同的形式接受参数。在编译代码时,我得到以下信息:

1
2
3
/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

你知道错误的原因吗?在爪哇中,您可以访问私有字段/函数,因此我无法理解C++中为什么不可能的原因。


In Java, you can access private fields/functions

< /块引用>

不,你不能,除非你在使用反射。这就是让某些事情变得私密的关键所在。我想你把这里的公共和私人混在一起了。(可以从类自身的主方法访问Java中的静态静态字段和方法)。C++中的主要功能不与类关联(即使是,您的代码仍然无法工作,因为您试图静态访问实例成员)。


1)如果不实例化类,就不能调用方法,或者只需先创建对象。

2)即使创建类的对象,对象也不能调用私有方法。因此,将numodom和numscan设置为公共方法。


这里有一些东西。

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

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


通常,在C++中,我们使用这些函数作为一个公共函数。

您是作为私有的,所以只要在自己的类范围内,您就可以访问它们。所以,如果你试图在主要方面使用它们,我们可以认为这些功能应该是公共的。

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


不能访问该类方法之外的任何私有方法(甚至在爪哇中)。

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


1)公共部分的公共方法

2)若要调用类的非静态公共方法,请首先创建该类的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    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

                              Scan nodes: %i
"
,
                              sl.numOdom(),
                              sl.numScan());
                }
                else{
                    return 1;
                }
            }
            return 0;
    }


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