【问题标题】:MFC C++ Class member variable, use instead the constructor with parameterMFC C++ 类成员变量,使用带参数的构造函数
【发布时间】:2020-07-20 20:56:24
【问题描述】:

这是 MFC C++(不是 C++ 0x11)。我有一个类,它有一个 CDerivedComboBox 的成员变量,称之为 CMyForm。我想为 CDerivedComboBox 创建一个构造函数,它传入一个参数,所以当我声明它时,我可以传递一个标志,也可以不传递。

例如在.h文件中,有两个构造函数

CDerivedComboBox();
CDerivedComboBox(bool specialFlag);

添加该构造函数实现时它编译得很好,但是在我使用它的类中,我无法弄清楚如何实际创建一个调用该构造函数的函数。这在 C++ 中是不可能的吗/

CDerivedComboBox combo; // works
CDerivedComboBox comboParam(true); // does not work

【问题讨论】:

  • 试试CDerivedComboBox comboParam{true};(注意用大括号代替括号)。应该使用足够现代的编译器。
  • 啊,在 VS2019 中确实有效,但在 VS2008 中无效。谢谢!
  • 如果编译器不够现代,您必须在包含类的构造函数初始值设定项列表中提供参数。例如。 class CMyForm { CDerivedComboBox combo; CMyForm() : combo(true) {} };
  • Pre C++11 你可以使用更明确的初始化器:CDerivedComboBox comboParam = CDerivedComboBox(true);
  • specialFlag 实际上是运行时决定吗?如果不是,请改用类型系统,派生 CSpecialComboBox 并让其实例成为您的类成员。 CSpecialComboBox 知道,这很特别。无需传递任何标志。

标签: c++ mfc


【解决方案1】:

CDerivedComboBox 应该是您的 CMyForm 的成员。看来您想在运行时为 CDerivedComboBox 动态调用不同的 ctor。因此,我建议将成员设为指向 CDrivedComboBox 的指针:

class CMyForm
{
CDerivedComboBox *m_pMyCombo;
}

CMyForm::CMyForm(..., CWnd *pParent = NULL) : m_pMyCombo(NULL)
{

if (somecondition)
  m_pMyCombo = new CDerivedComboBox();
else  // use specialFlag
  m_pMyCombo = new CDerivedComboBox(specialFlag);
}

记得在dtor中delete m_pMyCombo

【讨论】:

  • 几乎没有理由在 C++ 中使用operator new,当然也没有任何理由调用delete
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2018-02-22
  • 2014-05-22
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多