在父类的构造函数中构造成员对象 C++

Constructing a member object inside the parent class' constructor in C++

本文关键字:成员对象 C++ 父类 构造函数      更新时间:2023-10-16

我目前正在为我正在从事的一个项目学习OOP(我在高中,有一些c++经验;这是我的第三个"大型"(>3个月)C ++项目。我已经弄清楚了C++类的基础知识,并设法为该项目制作了一些类。

所以这些是我的页面.h标题:

class cl_Page{
public:
  cl_Page(cl_LessonMoment *parent_param);
  cl_Page(cl_SoftRoot *parent_param);
  int parent_type;
  cl_LessonMoment *parent_lmoment;
  cl_SoftRoot *parent_softroot;
  char id[256];
  //<content>
  //Backgrounds.
  str_Color bgcolor;
  cl_Image bgimage;
  //Actual content
  vector<cl_Textbox> textboxes;
  vector<cl_Button> buttons;
  vector<cl_Image> images;
  //</content>
};

(包括警卫等不在这里,但他们在我的项目中)

这是我的页面.cpp:

cl_Page::cl_Page(cl_LessonMoment *parent_param){
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '';
  //bgimage(NULL);
  SetColor(bgcolor, 0x000000ff);
}

(另一个构造函数类似,它只是设置了不同类型的父级)

我的问题是我想在我的cl_Page构造函数中调用构造函数到 bgimage(它是类类型cl_Image)。如果我尝试这样做(取消注释构造函数中的行),显然它不起作用。

所以是的,我现在如何调用构造函数?我真的需要构造每个成员以及cl_Page对象。

如果要

在构造函数中创建bgImage对象cl_Page它必须是指针(1),或者应该使用构造函数的初始化列表(2),在这种情况下,这可能是更好的解决方案。

1. - 字段是指向cl_Image的指针

bgImage = new cl_Image(nullptr);

2. - 构造函数初始化列表的使用

cl_Page::cl_Page(cl_LessonMoment *parent_param) :
      bgImage(nullptr) 
{
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '';
  SetColor(bgcolor, 0x000000ff);
}

在那里你可以阅读更多关于构造函数初始化列表的信息:http://www.cprogramming.com/tutorial/initialization-lists-c++.html

您可以使用成员初始化列表初始化变量:

cl_Page::cl_Page(cl_LessonMoment *parent_param)
: bgImage(NULL)
{
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '';
  SetColor(bgcolor, 0x000000ff);
}

实际上,这是在构造函数中设置数据的首选方法。

cl_Page::cl_Page(cl_LessonMoment *parent_param)
    : bgImage( nullptr )
{
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '';
  SetColor(bgcolor, 0x000000ff);
}

您需要像这样初始化您的成员:

cl_Page::cl_Page(cl_LessonMoment *parent_param)
: parent_lmoment(parent_param)
, parent_type(1)
, bgimage(NULL)
{
    id[0] = '';
    SetColor(bgcolor, 0x000000ff);
}

初始化构造函数头中的指针不是必需的,但我仍然推荐它。我还建议用 0 初始化另一个指针,如果您遇到错误,它可能会对您有所帮助;-)