没有匹配函数来调用" ClassName :: ClassName()"

时间:2016-08-31 15:44:49

标签: c++ constructor arduino

我在Arduino上使用cpp。我们说我的变量定义为

ClassName o;

我不确定这里到底发生了什么,但看起来像是在现场创建对象,寻找没有参数的默认构造函数。我没有这样的默认构造函数,因此错误:

no matching function for call to "ClassName::ClassName()"

但是,如果我添加一个指向变量的指针,那么一切都很好:

ClassName* o;

这里发生了什么?推荐使用这些样式的方法是什么?

2 个答案:

答案 0 :(得分:4)

  

我不确定这里到底发生了什么,但看起来像是在现场创建对象,寻找没有参数的默认构造函数。我没有这样的默认构造函数,因此错误。

正好这里发生了什么。如果声明一个这样的变量,它会立即创建。如果构造函数需要参数 - 只需在声明中提供它们:

   Class o(arg);

如果你还没有获得arg的值 - 只需推迟声明变量,直到你有。如果你真的必须推迟创建对象直到很久以后,使用:

    std::unique_ptr<Class> o;     // This declare a unique ptr and
                                  // initializes it to empty.

    ....
    o = make_unique<Class>(arg);  // Create the object on the heap,
                                  // and store the pointer in 'o'.

o超出范围时,对象将被销毁(确定性地)。

对于初学者,只是不要使用原始指针。他们太容易出错了。

答案 1 :(得分:0)

似乎该类未声明默认构造函数。也许它只有带参数的构造函数。

如果要声明类的对象(如

),则必须声明默认构造函数
ClassName o;

对于指针声明,它只声明一个指针,不会创建该类的对象。