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 “向量”
    #include "scan_node.h"
    #include “odom_node.h”
    #include “coord.h”

    类 stage_listener{
    上市:
        stage_listener();

    私人的:
        std::list odom_list;
        std::list 扫描列表;
        std::listcorners_list;

        std::list polar2cart(std::vector, 浮点数, 浮点数, 浮点数, 浮点数);
        void addOdomNode (const nav_msgs::Odometry);
        无效 addScanNode (const sensor_msgs::LaserScan);
        void extractCorners(std::vector, float, float, float, float);
        整数距离(浮动,浮动,浮动,浮动,浮动);
        无效节点2文本(std::vector,std::vector);
        int numOdom();
        整数扫描();
    };  

在相关的 .cpp 文件中,我写了一个 main:

    int main(int argc, char **argv){
            字符缓冲区[1024];
            而(1){
                int i = fscanf(stdin,"%s",buffer);

                如果(strcmp(“退出”,缓冲区)== 0)
                    退出(0);

                否则 if(strcmp("num_nodes",buffer) == 0){
                    ROS_INFO("里程计节点:%i\n扫描节点:%i",numOdom(),numScan());
                }

                别的{}
            }

    }

ROS_INFO 函数是 Willow Garage 的 ROS 的一部分,您可以像普通的 printf 一样使用它,以相同的形式获取完全相同的参数。在编译代码时,我得到以下信息:

/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:在函数'int main(int,char**)'中:
/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:223:5:错误:“numOdom”未在此范围内声明
/home/ubisum/fuerte_workspace/beginner/src/stage_listener.cpp:223:5:错误:“numScan”未在此范围内声明

你知道错误的原因吗?在 Java 中,您可以访问私有字段/函数,所以我无法理解在 C++ 中这是不可能的原因。

4

7 回答 7

6

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

不,你不能,除非你使用反射。这就是将某些东西设为私有的全部意义所在。我认为您在这里混淆了公共和私人。(不过,您可以从类自己的 main 方法访问 java 中的私有静态字段和方法)。C++ 中的 main 函数与类无关(即使是,您的代码仍然无法工作,因为您正试图静态访问实例成员)。

于 2012-11-28T16:24:39.663 回答
2

1)你不能在不实例化类的情况下调用方法,或者简单地说你必须先创建对象。

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

于 2012-11-28T16:35:16.723 回答
2

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

您将其作为私有的,因此您可以在自己的类范围内访问它们。因此,如果您尝试主要使用它们,我们可以认为这些功能应该是公共的。

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

于 2012-11-28T16:26:24.163 回答
2

这里有几件事。

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

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

于 2012-11-28T16:28:02.487 回答
1

您无法访问此类方法之外的任何私有方法(即使在 Java 中也是如此)。

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

于 2012-11-28T16:27:34.877 回答
0

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

于 2012-11-28T16:27:17.660 回答
0

1) public 部分中的公共方法

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;
    }
于 2012-11-28T17:32:04.447 回答