C :如何声明私人成员对象

C++: How to declare private member objects

本文关键字:成员对象 声明 何声明      更新时间:2023-10-16

可能的重复:
您如何为成员使用非默认构造函数?

我有当前代码:

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的副本吗?这需要复制构造函数吗?

您需要使用构造函数初始器列表:

TrainingDataPoint(const ImagePoint& image_point) : point(image_point){
}

您应该在可能的情况下更喜欢。但是,在某些情况下,您必须使用它:

  • 没有默认构造函数的成员(如您所提到的)
  • 会员参考
  • const成员

您不需要知道这些事情,因为您不会使用该代码,而只是为了完整性:

构造函数完成运行后,该指针将指向一个 清除对象?

是的,当构造函数退出时,参数image_point被破坏。因此,您是对的,将指针存储在对象中并在此之后尝试使用它是不正确的。

如果是这样,我是否必须制作image_point的副本?

那会做到的,但是您不使用此代码的原因是的问题 您将其复制到。

这需要复制构造函数吗?

是的,但是ImagePoint已经有一个复制构造函数,编译器为您自动生成。

只需使用构造函数初始器列表:

class TrainingDataPoint 
{
private:
    ImagePoint point;
public:
    TrainingDataPoint(const ImagePoint &imgpt) 
         : point(imgpt)
    {
        // other code here as necessary. point has already been initialized
    }
};

您阅读的内容是错误的。正确的选择是使用初始化列表

class TrainingDataPoint{
private:
    ImagePoint point;
public:
    TrainingDataPoint(ImagePoint image_point) : point(image_point){
    }
};

顺便说一句,这与私人成员无关,如果他们是公共的,您会遇到同样的问题。

使用构造函数初始化器将解决您的问题。

TrainingDataPoint(const ImagePoint& image_point) : point(image_point){
}