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 "vector"
    #include "scan_node.h"
    #include "odom_node.h"
    #include "coord.h"

    クラスstage_listener{
    公衆:
        stage_listener();

    プライベート:
        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 距離 (float、float、float、float、float);
        void nodes2text(std::vector, std::vector);
        int numOdom();
        int numScan();
    };  

関連する .cpp ファイルに、main を書きました。

    int main(int argc, char **argv){
            文字バッファ [1024];
            ながら(1){
                int i = fscanf(stdin,"%s",buffer);

                if(strcmp("終了",バッファ) == 0)
                    終了 (0);

                それ以外の場合 (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では、プライベートフィールド/関数にアクセスできます

いいえ、リフレクションを使用していない限り、できません。それが何かを非公開にすることの要点です。公立と私立を混同していると思います。(ただし、クラス独自のメイン メソッドから Java のプライベートな静的フィールドとメソッドにアクセスできます)。C++ のメイン関数はクラスに関連付けられていません (関連付けられていたとしても、インスタンス メンバーに静的にアクセスしようとしているため、コードは機能しません)。

于 2012-11-28T16:24:39.663 に答える
2

通常、C++ では、関数を public として使用します。

プライベートとして行ったので、自分のクラスのスコープ内でアクセスできます。したがって、メインで使用する場合は、これらの関数を公開する必要があると考えることができます。

そして、クラスのオブジェクトを宣言する必要があります。したがって、object.function(); を使用して関数にアクセスできます。指図。

于 2012-11-28T16:26:24.163 に答える
2

ここにはいくつかのことがあります。

まず、stage_listener オブジェクトを作成してそのメソッドを呼び出すか、メソッドを static にしてから、オブジェクトに同じメソッドを共有させたい場合は、スコープ解決演算子を使用して関数を呼び出す必要があります。次に、プライベート変数にアクセスできません (これがオブジェクト指向言語でのデータ隠蔽のポイントです)。

そのため、関数をクラスで公開し、クラスのオブジェクトを作成するか、関数を静的にして、スコープ解決演算子を使用してそれらを呼び出す必要があります。何を達成しようとしているかに完全に依存します。これが役立つことを願っています。

于 2012-11-28T16:28:02.487 に答える
2

1)クラスをインスタンス化せずにメソッドを呼び出すことはできません。または、最初にオブジェクトを作成する必要があります。

2) クラスのオブジェクトを作成しても、オブジェクトはプライベート メソッドを呼び出すことができません。したがって、numOdom と numScan を public メソッドにします。

于 2012-11-28T16:35:16.723 に答える
1

このクラスのメソッド以外のプライベート メソッドにアクセスすることはできません (Java であっても)。

外部で使用するメソッドをパブリックとして設定します

于 2012-11-28T16:27:34.877 に答える
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;
    }
于 2012-11-28T17:32:04.447 に答える
0

C++ では、main 関数は定義したクラスの一部ではないため (「関連付けられた .cpp ファイル内」にあるにもかかわらず)、プライベート フィールドにアクセスできません。Java と同様に C++ では、クラスで宣言されている関数のみがクラスの一部であるため、プライベート フィールドにアクセスできます。

于 2012-11-28T16:27:17.660 に答える