可能重复:
How do you use the non-default constructor for a member?
我有当前的代码:
class ImagePoint {
private:
int row;
int col;
public:
ImagePoint(int row, int col){
this->row = row;
this->col = col;
}
int get_row(){
return this->row;
}
int get_col(){
return this->col;
}
};
我想这样做:
class TrainingDataPoint{
private:
ImagePoint point;
public:
TrainingDataPoint(ImagePoint image_point){
this->point = image_point;
}
};
但是这不会编译,因为行ImagePoint point;
要求ImagePoint
类具有空构造函数。替代(从我读过的)说我应该使用指针:
class TrainingDataPoint{
private:
ImagePoint * point;
public:
TrainingDataPoint(ImagePoint image_point){
this->point = &image_point;
}
};
但是,一旦构造函数完成运行,此指针是否指向已清除的对象?如果是这样,我是否必须复制image_point
?这需要复制构造函数吗?
答案 0 :(得分:9)
您需要使用构造函数初始化列表:
TrainingDataPoint(const ImagePoint& image_point) : point(image_point){
}
如果可能,您应该更喜欢这个。但是,有些情况下您必须使用它:
const
成员答案 1 :(得分:2)
您不需要知道这些事情,因为您不打算使用该代码,只是为了完整性:
一旦构造函数完成运行,此指针将指向a 清理对象?
是的,当构造函数退出时,参数image_point
将被销毁。所以你是对的,在对象中存储指向它的指针并在之后尝试使用它是不正确的。
如果是这样,我是否必须复制image_point?
这样做会,但你不打算使用这段代码的原因是 你要复制它的问题。
这需要复制构造函数吗?
是的,但是ImagePoint
已经有了一个编译器,编译器会自动为你生成。
答案 2 :(得分:1)
你读过的是错的。正确的选择是使用初始化列表
class TrainingDataPoint{
private:
ImagePoint point;
public:
TrainingDataPoint(ImagePoint image_point) : point(image_point){
}
};
顺便说一句,这与私人成员无关,如果他们是公开的,你会得到同样的问题。
答案 3 :(得分:1)
只需使用构造函数初始化列表:
class TrainingDataPoint
{
private:
ImagePoint point;
public:
TrainingDataPoint(const ImagePoint &imgpt)
: point(imgpt)
{
// other code here as necessary. point has already been initialized
}
};
答案 4 :(得分:1)
使用构造函数初始化程序将解决您的问题。
TrainingDataPoint(const ImagePoint& image_point) : point(image_point){
}