尝试按值将对象传递给C ++中的构造函数

时间:2015-03-22 04:31:22

标签: c++ constructor reference

所以我一直试图制作一个测试程序来显示按引用传递对象和按值传递的区别。

我希望ClassB的构造函数接受两个参数:对ClassA的引用和ClassA的值。

当构造函数只接受引用时,我能够运行程序。但是,当我添加第二个参数(对于ClassA的值)时,我得到错误"没有匹配函数来调用' ClassA :: ClassA()'"。"。

#include <iostream>
using namespace std;

class ClassA{
    int num;

public:
    ClassA(int _num){
        num = _num;
    }

    int getNum(void){
        return num;
    }

    void addToNum(int value){
        num += value;
    }
};

class ClassB {
    ClassA * classPointer;
    ClassA classValue;

public:
    ClassB(ClassA& referencedClass, ClassA value){ // HERE I get the error
        classPointer = &referencedClass;
        classValue = value;
    }

    int getPointedNum(void){
        return classPointer->getNum();
    }

    int getValueNum(void){
        return classValue.getNum();
    }
};

int main(int argc, char *argv[]) {

    ClassA classA (20);
    ClassB classB (classA, classA);
    classA.addToNum(5);
    cout << "classB.getPointedNum(): " << classB.getPointedNum() << endl;
    cout << "classB.getValueNum(): " << classB.getValueNum() << endl;


    return 0;
}

有没有人知道这里发生了什么?

感谢。

2 个答案:

答案 0 :(得分:0)

您需要通过调用其构造函数显式初始化classValue,因为您已通过定义非默认构造函数来删除其默认构造函数。

这必须在构造函数的member initialization list中完成,因为成员变量在进入构造函数体之前已初始化:

ClassB(ClassA& referencedClass, ClassA value)
: classPointer(&referencedClass), classValue(value) // member initialization list
{
    // constructor body
}

这会使用值classPointer初始化&referencedClass,并使用ClassA调用value的默认复制构造函数。

答案 1 :(得分:0)

您看到的错误对应于成员classValue缺少初始值设定项。

使用时

ClassB(ClassA& referencedClass, ClassA value) { ... }

编译器尝试使用默认构造函数初始化classValue。由于没有,因此无法初始化classValue

您可以使用:

ClassB(ClassA& referencedClass, ClassA value) :
    classPointer(&referencedClass_,
    classValue(value)
{
}