错误 - 没有匹配函数来调用类作为属性c ++

时间:2017-12-20 00:40:26

标签: c++

我知道这已被多次询问,但我没有找到任何有用的方法来解决我的问题。 我的头文件类似于:

#include Myclass2.h
class Myclass{
public:
    Myclass2 instance;
   ... 
    Myclass(Myclass2 instance, param1, ecc.);

虽然实现文件和其他东西只是实现了构造函数:

Myclass::Myclass(Myclass2 instance,...){
this->instance = instance;

基本上,我想从类中访问实例对象,但我担心这不是正确的方法,因为它不会编译错误''没有匹配函数来调用Myclass2 :: Myclass2()和然后它抱怨Myclass2接受多个参数(就像它一样)并且我提供它0。

但是我没有将它构建到类中,我只想将已经创建的对象带入构造函数中!

有关如何解决错误或问题的任何想法?谢谢!

修改

class Myclass2{
public:
    Myclass2(param1, param2, param3, param4);
 } 

1 个答案:

答案 0 :(得分:0)

正如其他人在评论中所说,可能没有默认构造函数 Myclass2 和Myclass的复制构造函数。我们没有看到实际的代码,但我认为这个例子会有所帮助:

class Myclass2 {
public:
    Myclass2() = default;
    Myclass2(int const& x) : x(x) {}
    Myclass2(Myclass2 const& myclass2) : Myclass2(myclass2.x) {}

    int x;
};

class Myclass{
public:
    Myclass() : instance() {}
    Myclass(Myclass2 const& instance) : instance(instance) {}
    Myclass(Myclass const& myclass) : Myclass(myclass.instance) {}

    Myclass2 instance;
};

在某些情况下,显式生成的默认构造函数被禁用(比如我们声明自己的构造函数,更多信息http://en.cppreference.com/w/cpp/language/default_constructor),因此我们必须再次编写它们。我们需要创建构造函数Myclass2() : ...,以便我们可以默认初始化,例如Myclass2 myclass;如果类的所有成员都是默认构造的,我们可以通过声明Myclass2() = default; 来自动生成它(C ++ 11)

您的代码this->instance = instance;中的行似乎属于成员初始化列表中的某些内容 - 它甚至会在"之前初始化成员。构造函数,因此您可以拥有const成员,否则您将无法初始化。语法是:

Myclass(Myclass2 instance) : instance(instance) {
// the rest of constructor, where you can do what you want with already initialized instance
}

不要担心instance(instance)语法,它会识别出什么是什么(尽管有些人认为相同的名称有点令人困惑)。 正如其他人指出的那样,如果您没有将Myclass2实例作为参考,那么您正在创建临时副本,并且Myclass2没有复制构造函数。

复制构造函数(对于Myclass只有Myclass const& instance参数的那个)是我们想要初始化类Myclass myclass(otherMyclass);时使用的。

例如,通过Myclass(something) : Myclass() {}委托构造函数非常常见。

(有关何时需要创建http://en.cppreference.com/w/上可用的

)的信息

有时我们可能还需要创建复制赋值运算符(http://en.cppreference.com/w/cpp/language/copy_assignment),因此我们可以执行以下操作:

Myclass m1;
Myclass m2;
m2 = m1;

但明确的一个可能就足够了,如果不是你肯定想读What is The Rule of Three?What is the Rule of Four (and a half)?