我有几个数据成员是容器的类: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;
}