【问题标题】:No appropriate default constructor available没有合适的默认构造函数可用
【发布时间】:2016-04-22 12:42:57
【问题描述】:

我正在尝试为不带参数的“控制”类使用构造函数,但是当我尝试创建它的实例时,我收到一条错误消息,提示“没有合适的默认构造函数可用”

这是我的标题:

class Control
{
public:
    Control();

private:
    Layout activeLayout;

    void createLayout();
    void moveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight,           std::string windowTitle);
    void mainLoop();
};

#endif

我的 cpp 文件:

 Control::Control()
{
    Detector mainDetector();

    createLayout();
    mainLoop();
}

以及我尝试给导师打电话的地方:

int _tmain(int argc, _TCHAR* argv[])
{
    Control mainControl();

    system("PAUSE");

    return 0;
};

【问题讨论】:

    标签: c++ class parameters constructor syntax-error


    【解决方案1】:

    注意

    Detector mainDetector();
    

    是一个函数声明,而不是Control 类型变量的定义。 当没有参数时,语法是

    Detector mainDetector;
    

    在某些情况下,即使看起来不可能,也会推断出局部函数的声明......这被称为 C++ 的“the most vexing parse”规则。

    一个简单的例子是:

    double pi = 3.141592654;
    int int_pi(int(pi));
    

    这里int_pi 被声明为一个函数真是太神奇了!

    【讨论】:

    • 请告诉我是 6502A 还是 6502B,是 Acorn 还是 BBC 机器
    • @EdHeal: 抱歉...苹果 ][ :-)
    • 我不知道他们使用相同的 8 位处理器。每天了解过去
    • 嗯,我之前的错误消失了,但现在我得到一个类似的“没有适当的默认构造函数可用”的错误,但这次它在错误前面显示“布局:”.. 这有必要吗使用我在标题中使用的自定义“布局”结构?我用完整的标题更新了问题,真的无法弄清楚我做错了什么..
    • @ColdZer0: 如果Control 类包含Layout 对象,它必须在初始化列表中对其进行初始化......事实上你有一个createLayout 函数让我觉得你正在尝试而是在构造函数主体中执行此操作。这是不可能的......在进入构造函数的主体时,所有成员必须已经在初始化列表中或使用默认构造函数进行了初始化。一个糟糕的解决方法是为Layout 编写一个默认构造函数,使其处于无效状态,稍后可以通过createLayout 代码修复。
    【解决方案2】:

    改变

     Control mainControl();
    

     Control mainControl;
    

    这应该可以解决问题

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2016-01-22
      • 2014-06-23
      • 1970-01-01
      • 2022-11-01
      • 2013-03-20
      相关资源
      最近更新 更多