从主函数访问私有字段和函数

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_node> odom_list;
    std::list<scan_node> scan_list;
    std::list<coord> corners_list;
    
    std::list<coord> polar2cart(std::vector<float>, float, float, float, float);
    void addOdomNode (const nav_msgs::Odometry);
    void addScanNode (const sensor_msgs::LaserScan);
    void extractCorners(std::vector<float>, float, float, float, float);
    int distance (float, float, float, float, float);
    void nodes2text(std::vector<odom_node>, std::vector<scan_node>);
    int numOdom();
    int numScan();
};  

在相关的.cpp文件中,我编写了一个主函数:
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一样使用它,以完全相同的形式获取参数。 编译代码时,我得到以下结果:


1
你必须在主文件中包含头文件并在使用函数之前创建对象(这些函数必须是公共的,才能在类外使用)。后者与Java中相同。 - chris
6
你只会Java编程,却认为私有成员可以在类外部访问?你的问题肯定有问题。 - Nikos C.
2
在Java中,“main”是一个类成员(或者Java术语的叫法),因此可以访问类的私有成员,但不能访问其他类的私有成员。也许这就是你的意思? - Mike Seymour
1
我导入了.h文件,为了简洁起见省略了包含文件。 我的意思是,在Java中,如果你从定义这些函数/字段的类中的主函数内部访问私有函数/字段,那么你就可以访问它们。 - ubisum
1
@user1860467,你尝试的仍然没有意义。在Java中,main是一个static方法。你仍然需要创建一个类实例才能调用它的方法,除非所有相关的方法都是static的,但显然这里不是这种情况。 - Praetorian
显示剩余3条评论
7个回答

6
在Java中,你不能访问私有的字段/函数,除非你使用反射。这也是将某些内容设置为私有的主要原因。我认为你可能混淆了public和private。(但是从类自己的main方法中,你可以访问Java中的私有静态字段和方法)。C++中的main函数与类无关(即使与类有关,你的代码仍然无法工作,因为你试图静态访问实例成员)。

2
通常,在C++中,我们将函数用作公共函数。
您将其用作私有函数,因此只能在自己的类范围内访问它们。因此,如果您尝试在主函数中使用它们,我们可以认为这些函数应该是公共函数。
并且您需要声明一个类对象。因此,您可以使用object.function();命令来访问函数。

2

这里有几件事情需要注意。

首先,你需要创建stage_listener对象以调用其方法,或将方法静态化,然后使用作用域解析运算符来调用函数,如果你想让对象共享同一个方法。 其次,在面向对象编程语言中,无法访问私有变量(这就是数据隐藏的目的)。

因此,你需要在类中将函数设为public,并创建该类的对象,或者将函数静态化,并使用作用域解析运算符调用它们。完全取决于你要完成什么任务。希望这能帮到你。


2

1) 您必须先创建对象,然后才能调用方法。换句话说,您不能在不实例化类的情况下调用方法。

2) 即使您创建了类的对象,该对象也无法调用私有方法。因此,请将numOdom和numScan方法设置为公共方法。


1

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

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


0

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

  1. 公共方法在公共部分中
  2. 要调用类的非静态公共方法,首先创建一个类的实例。谢谢
- fedorshishi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接