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