【问题标题】:C++:从 main 访问私有字段和函数
【发布时间】:2012-11-16 13:49:10
【问题描述】:

在我的职业生涯中,我只使用 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++ 中这是不可能的原因。

【问题讨论】:

  • 您必须在主文件中包含标题并在使用函数之前创建一个对象(必须公开才能在类外使用)。后者与 Java 相同。
  • 您只使用 Java 编程,但您认为私有成员可以在课堂外访问?你的问题一定有问题。
  • 在 Java 中,main 是一个类成员(或任何 Java 术语),因此可以访问 that 类的私有成员,但不能访问其他类的私有成员。也许这就是你的意思?
  • 我导入了 .h 文件,为简洁起见省略了包含。我的意思是,在 java 中,如果你从定义了这些函数/字段的类中包含的 main 内部执行此操作,则可以访问私有函数/字段
  • @user1860467 你正在尝试的仍然没有意义。在 Java 中,main 是一个 static 方法。你仍然需要为main 创建一个类实例才能调用它的方法,除非所有有问题的方法也是static,但显然这里不是这种情况。

标签: c++ function field private main


【解决方案1】:

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

【讨论】:

  • 谢谢 1) public 部分中的公共方法 2) 调用类的非静态公共方法,首先创建类的实例
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      这里有一些东西。

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 2017-12-21
              • 2012-06-07
              • 1970-01-01
              • 2021-07-23
              • 1970-01-01
              • 2013-03-08
              • 2011-12-29
              • 1970-01-01
              • 2010-11-09
              相关资源
              最近更新 更多