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

时间:2014-07-18 16:53:39

标签: c++ stl

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

我的班级状态代表四旋翼飞行器的状态。我使用的是OpenCV,我的数据成员如下:

cv::Point3d X,V,b;
std::vector<Feature> features;

其中,Feature是描述环境中的地标的另一个类。

最初,我通过引用传递类实例:

foo( State& s );

迭代向量时结果是垃圾。

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

foo( State *s);

我有点惊讶,使用指针解决了我的问题,但至少我有一个解决方案。

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

inline States operator+(States lhs, const States& rhs)
{
    lhs+=rhs;
    return lhs;
}

在States类中定义了以下方法:

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

问题是,我的operator +,+ =,add()中是否有明显的错误,而且我定义和访问容器成员的方式有问题吗?

编辑:提供类定义以及运算符和构造函数定义。 States.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;
}

0 个答案:

没有答案