Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确声明和访问C++类中的容器数据成员?_C++_Stl - Fatal编程技术网

如何正确声明和访问C++类中的容器数据成员?

如何正确声明和访问C++类中的容器数据成员?,c++,stl,C++,Stl,我有几个类的数据成员是容器:std::vector和std::map。我发现在一些情况下,我在访问这些容器时会得到垃圾数据。我开始认为必须有一种正确的方法来声明、传递和访问以容器作为数据成员的类。然而,我对容器和类的所有搜索都返回容器类的操作,这不是我要处理的 我的类状态表示四转子的状态。我使用的是OpenCV,我的数据成员如下所示: cv::Point3d X,V,b; std::vector<Feature> features; 在向量上迭代时,结果是垃圾 我可以通过传递指针来

我有几个类的数据成员是容器:std::vector和std::map。我发现在一些情况下,我在访问这些容器时会得到垃圾数据。我开始认为必须有一种正确的方法来声明、传递和访问以容器作为数据成员的类。然而,我对容器和类的所有搜索都返回容器类的操作,这不是我要处理的

我的类状态表示四转子的状态。我使用的是OpenCV,我的数据成员如下所示:

cv::Point3d X,V,b;
std::vector<Feature> features;
在向量上迭代时,结果是垃圾

我可以通过传递指针来解决此问题:

foo( State *s);
我有点惊讶,使用指针解决了我的问题,但至少我有一个解决方案

现在我遇到了第二个问题,重载了运算符+和运算符+=,这导致了类似的意外行为。我将在下面发布这些方法的代码: +运算符在States类之外定义:

inline States operator+(States lhs, const States& rhs)
{
    lhs+=rhs;
    return lhs;
}
    States&
States::operator+= ( const States& rhs )
{
    this->add(&rhs);
    return *this;
}

void States::add(const States& a)
{
    X += a->X;
    V += a->V;
    for(int i = 0; i<5; i++ )
    {
        features[i].position.body += a->features[i].position.body;
        features[i].position.world += a->features[i].position.world;
    }
    b += a->b;
}
在States类中定义了以下方法:

inline States operator+(States lhs, const States& rhs)
{
    lhs+=rhs;
    return lhs;
}
    States&
States::operator+= ( const States& rhs )
{
    this->add(&rhs);
    return *this;
}

void States::add(const States& a)
{
    X += a->X;
    V += a->V;
    for(int i = 0; i<5; i++ )
    {
        features[i].position.body += a->features[i].position.body;
        features[i].position.world += a->features[i].position.world;
    }
    b += a->b;
}
问题是,我的操作符+、++=、add中是否有任何明显的错误,而且我定义和访问容器成员的方式是否存在一些问题

编辑:提供类定义、运算符和构造函数定义。 国家h:

class States{

public:
    Vec3d X;
    Vec3d V;
    Vec3d b;
    std::vector<Feature> features;
    std::map<int,Feature> feats;

    // constructor
    States();
    ~States();
    States(Vec3d pos, Vec3d vel, std::vector<Feature> feat, Vec3d bias, int n);
    States(cv::Mat kx);

    // accessor
    Vec3d getX();
    Vec3d getV();
    std::vector<Feature> getFeatures();
    Feature getFeature(int i);
    Vec3d getb();
    int getRows();
    int getNumFeatures();

    // mutator
    void update_features( ImageSensor *imgsense, Sensors sense );
    void end_loop (  );
    void setX(Vec3d pos);
    void setV(Vec3d vel);
    void setFeature(int i, Feature f);
    void addFeature(Feature f);
    void setb(Vec3d bias);
    void add(States a);
    States dynamics( Sensors s );
    //Operator
    States& operator*= ( const double& rhs );
    States& operator+= ( const States& rhs );
private:
};
inline States operator*(States lhs, const double& rhs)
{
    lhs*=rhs;
    return lhs;
}

inline States operator+(States lhs, const States& rhs)
{
    lhs+=rhs;
    return lhs;
}
States.cpp操作符和构造函数:这里的add有点不同,因为它来自更高版本,但问题是相同的

    States&
States::operator+= ( const States& rhs )
{
    this->add(rhs);
    return *this;
}

States::States ( cv::Mat kx )
{
    int nf;
    nf = (kx.rows-9)/3;
    setX( cv::Vec3d( kx.at<double>(0,0), kx.at<double>(1,0), kx.at<double>(2,0)) );
    setV( cv::Vec3d( kx.at<double>(3,0), kx.at<double>(4,0), kx.at<double>(5,0)) );
    for( int i=0; i<nf; ++i )
    {
        Feature ft( cv::Vec3d( kx.at<double>(9+3*i,0), kx.at<double>(10+3*i,0),  kx.at<double>(11+3*i,0) ),
                cv::Scalar(0,0,0), 0 );
            addFeature(ft);
    }
    setb( cv::Vec3d( kx.at<double>(6,0), kx.at<double>(7,0), kx.at<double>(8,0) ) );
    return ;
}       /* -----  end of method States::States  ----- */


States::States(Vec3d pos, Vec3d vel, std::vector<Feature> feat, Vec3d bias, int n)
{
    X = pos;
    V = vel;
    features = feat;
    b = bias;
}

void States::add(States a)
{
    if( a.getNumFeatures()!=getNumFeatures() )
    {
        std::cerr << "add: feature mismatch" << std::endl;
        exit(EXIT_FAILURE);
    }
    X += a.X;
    V += a.V;
    for(int i = 0; i<getNumFeatures(); i++ )
    {
        features[i].position.body += a.features[i].position.body;
        features[i].position.world += a.features[i].position.world;
    }
    b += a.b;
}

我不相信用指针而不是引用真的解决了你的问题。@Quentin不,它是故意按值传递的。如果通过引用传递,则在执行+=”之前,仍然需要在运算符+内进行本地复制。使用foo State&s;没有问题;,如果你发布了一个小型的工作示例,最好得到回复。是的,我宁愿先用参考资料来解决你的问题。这可能会解决这个问题。我建议结束这个问题,回到参考问题,制定一个工作示例,然后发布一个关于这个问题的新问题。@JosephMansfield ouch,周末可见。。。