【问题标题】:Member object in a class which calls it parential constructor [closed]类中的成员对象,称为父构造函数[关闭]
【发布时间】:2012-07-19 13:18:01
【问题描述】:

在我的 .h 中,我有这样的东西:



class Cbeckhoff_frontendDlg : public CDialogEx
    {
    // construction
    public:
    Cbeckhoff_frontendDlg(CWnd* pParent = NULL);
    //...
    //this is the member object I want to create
    Modul test;
    };

我的 .cpp 看起来像这样:



Cbeckhoff_frontendDlg::Cbeckhoff_frontendDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Cbeckhoff_frontendDlg::IDD, pParent)
    {
    //..
    };
    //and should look like this:
    Cbeckhoff_frontendDlg::Cbeckhoff_frontendDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Cbeckhoff_frontendDlg::IDD, pParent),test()
    {
    //..
    };

我弄乱了我试图在这里发布的前一个测试用例,对此我很抱歉。我想我不太明白那里发生了什么。我假设 Cbeckhoff_frontendDlg 启动父级 CDialogEx- 构造函数,但我也想启动我自己的构造函数测试。这可能吗?

【问题讨论】:

  • 你到底想做什么?你的第二个构造函数应该尽我所能做你想做的事情......
  • 我只想创建一个成员对象。他抱怨 Modul 没有定义并且他假设为 int,但是在没有父构造函数调用的情况下创建一个完全不同的类我能够生成我的测试对象

标签: c++ class object constructor member


【解决方案1】:

如果Modul有一个默认构造函数,而你又不想使用另一个构造函数,下面的就足够了:

Cbeckhoff_frontendDlg::Cbeckhoff_frontendDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Cbeckhoff_frontendDlg::IDD, pParent) {}

如果你想使用另一个构造函数(例如,一个接收整数),你可以这样做:

Cbeckhoff_frontendDlg::Cbeckhoff_frontendDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Cbeckhoff_frontendDlg::IDD, pParent), test(some_integer) {}

编辑:至于分号,您不应该在方法主体后使用分号:

class Foo {
    Foo() {
        // ...
    } // <- no semicolon

    void bar() {
        // ...
    } // <- no semicolon
}; // <- at the end of a class you need a semicolon

【讨论】:

  • Modul(){}; 〜模块(){}; Modul(int ID, Cbeckhoff_frontendDlg* pCbeckhoff,void* pVar,PAmsAddr pAdr){ SetID(ID); plcVar = pVar; pAddr = pAdr;};我有一个没有参数的默认构造函数和一个带有一些参数的默认构造函数,即使我使用默认构造函数也不起作用。他抱怨缺少分号或分号太多,但我很确定这是误导
  • @user1534683 你确实在两个构造函数的定义末尾多了一个分号。
  • @user1534683 顺便说一句,如果您想继续从社区收到答案,您最好开始投票并接受有用的答案。如果您是 SO 新手,可以查看how the system works
  • 感谢您的介绍。不幸的是,我不明白在哪里删除分号..
  • @user1534683 看看我更新的答案。希望在哪里需要使用分号以及在哪里不应该使用分号会更清楚。
【解决方案2】:

如果我对您的代码理解正确,您的 Modul 类有一个构造函数,该构造函数接受 Cbeckhoff_frontendDlg* 的参数,该参数具有 Modul 类型的成员。 您是否在 Modul.h 文件中转发声明了 Cbeckhoff_frontendDlg 类?

编辑 再次查看您的代码,我认为您还没有看到一些错误。你说主类没有编译,因为 modul 是未定义的。我原以为 Modul 中也会出现编译错误,说 Cbeckhoff_frontendDlg 没有定义。因此,您可能没有编译 Modul 文件,“Modul.h”文件中没有替代构造函数的声明。
如果我是你,我会仔细检查你认为正在编译的所有内容是否正在通过干净的构建进行编译。

【讨论】:

  • 我以前从未听说过前向声明,但在我看来,如果你的类有不同的头文件,这似乎是正确的方法。在我的情况下,类 Modul 与 Cbeckhoff_frontendDlg::Cbeckhoff_frontendDlg(CWnd* pParent /*=NULL*/) 位于相同的 .h 中,但 CDialogEx 位于不同的 .h 中是否有问题?
  • 文件名在 C++ 中无关紧要,将类放在同名文件中只是一个好习惯。前向声明用于类(在本例中为 Modul)使用指向使用第一个类 (Modul) 的类 (Cbeckhoff_frontendDlg) 的指针。您需要做的就是在“class Modul{”上方的行中输入语句“class Cbeckhoff_frontendDlg;” (不要输入引号并记住分号)。这“告诉”编译器有一个名为 Cbeckhoff_frontendDlg 的类,它将在链接所有目标文件之前在某处定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多