返回get/set方法中的向量

returning a vector in get/set method

本文关键字:向量 方法 set get 返回      更新时间:2023-10-16

我正在尝试将c 中的get/set方法用于向量。我不断出现一个错误,抛出一个std :: out_of_range的实例,该实例发生在我的主代码中 ego_points.at(1(时发生 ego_points.at 时发生的错误。我在下面提供标题文件和主要代码,但我会尝试在此处解释:

我有一个名为的类,带有一个称为 scancallback 的公共功能,该函数构建vector scandeddata 并使用 set set 函数设置私有向量 TransMittyData 等于 scandedData 。在我的主代码中,我有一个对象,称为> point> points class的对象,并且我正在尝试设置一个称为 ego_points 等于<<<<<的向量strong> transmitteddata object p1 。我能够使用getVector((函数来构建向量ego_points,但无法访问其数据。有人知道为什么不这样做吗?

标题文件:

#pragma once
#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
#include "iostream"
#include "string"
#include "motor_driver/Motor_speeds.h"
#include "motor_driver/cartesian.h"
#include <vector>
#ifndef MOTOR_DRIVER_H
#define MOTOR_DRIVER_H
using namespace std;
using namespace motor_driver;
class Points {
        public:
                vector<float> scannedData;
                int i;
                int size;
                int size1;
                int size2;
                Points() : scannedData(0) {}            //Must match the class name. This is the constructor.
                void set(vector<float> transmittingData){
                        transmittedData = transmittingData;
                }
                void ScanCallback(const sensor_msgs::LaserScan::ConstPtr& scan) {
                                scannedData.clear();
                                size = scan->ranges.size();
                                scannedData.resize(size);
                                for(i = 0; i < size; i = i + 1){
                                        scannedData.at(i) = scan->ranges[i];
                                }
                                set(scannedData);
                }
                int getSize(){
                        return size;
                }
                vector<float> getVector(){
                        return transmittedData;
                }
        private:
                vector<float> transmittedData;
};
#endif

主代码:

#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
#include "iostream"
#include "string"
#include "motor_driver/Motor_speeds.h"
#include "motor_driver/cartesian.h"
#include <motor_driver.h>
#include <vector>

using namespace std;
using namespace motor_driver;
Points p1;
int main(int argc, char** argv) {
        ros::init(argc, argv, "motor_driver_node");
        ros::NodeHandle nh;
        ros::Subscriber sub;
        ros::Rate r(1);
        int ss;
        int newsize;
        int index;
        vector<float> ego_points;
        while (ros::ok()) {
                sub = nh.subscribe<sensor_msgs::LaserScan>("/scan",10, &Points::ScanCallback, &p1);
                newsize = p1.getSize();
                ego_points.clear();
                ego_points.resize(newsize);
                ego_points = p1.getVector();
                cout << ego_points.at(1) << endl;
                r.sleep();
                ros::spinOnce();
        }
        return 0;
}

我的错误:

:~/Desktop/Naes_Thesis$ rosrun motor_driver motor_driver_node 
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check
Aborted (core dumped)

矢量至少有两个元素?如果要访问第一个元素,则应使用:

cout << ego_points.at(0) << endl;

大小方法可能不正确。应该是这样的:

int getSize() const {
    return transmittedData.size();
}

否则大小可能包含与实际矢量大小

不同的值

实际上我已经弄清楚了。问题是向量的大小为0,直到构建向量为止。因此,我添加了一个if(vector = 0(,然后在代码上(不做(部分并将其修复。感谢Noel-Lopes和1201 Programagalarm的贡献。