注册 登录
编程论坛 C++教室

封闭类的复制构造函数问题

y442974010f 发布于 2016-08-02 16:23, 4855 次点击
#include <iostream>
using namespace std;
class Base {
public:
    int k;
    Base(int n) :k(n) { }
};
class Big {
public:
    int v; Base b;
    Big(int n) :v(n),b(n) {};
    Big(const Big &x)             编译器提示此处有错误,说Base没有合适的构造函数可用
    {
        v = x.v;
        b = x.b;
    }
};
int main() {
    Big a1(5);    Big a2 = a1;
    cout << a1.v << "," << a1.b.k << endl;
    cout << a2.v << "," << a2.b.k << endl;
    return 0;
}

不是很明白,有没有大神给我讲解一下?感谢!
8 回复
#2
rjsp2016-08-02 19:34
#include <iostream>
using namespace std;
class Base {
public:
    int k;
    Base(int n) :k(n) { }
};
class Big {
public:
    int v; Base b;
    Big(int n) :v(n),b(n) {};
    Big(const Big &x) : v(x.v), b(x.b)
    {
    }
};
int main() {
    Big a1(5);    Big a2 = a1;
    cout << a1.v << "," << a1.b.k << endl;
    cout << a2.v << "," << a2.b.k << endl;
    return 0;
}
#3
yangfrancis2016-08-05 10:17
回复 楼主 y442974010f
Big(const Big &x)
这个形参要求不带参数地构造一个Big对象。没有相关构造函数,一定会报错。
#4
yangfrancis2016-08-05 10:19
回复 楼主 y442974010f
看错了,好像不是因为这个
#5
yangfrancis2016-08-05 10:20
Big a2 = a1;
是这一步的调用找不到构造函数才对
#6
y442974010f2016-08-05 11:43
回复 5楼 yangfrancis
可是这一步不是调用的是复制构造函数吗,在类里已经定义了复制构造函数了啊?
#7
pigautumn2016-08-06 09:36
Base没有不带参数的构造函数,因此在Big的复制构造函数中的赋值代码 b = x.b; 找不到合适的b的构造函数
#8
yangfrancis2016-08-06 19:06
回复 6楼 y442974010f
这个只算是初始化,a1不是作为参数传给构造函数的哦
#9
景昔2016-08-08 21:00
#include <iostream>
using namespace std;
class Base
{

public:   
    int k;
    Base();
    Base(int n):k(n){}
};
class Big:public Base
{

public:   
    int v;
    Big(int n,int n1):Base(n),v(n1){}
    Big(const Big &x)
    {
        v = x.v;
        k=x.k;
        
    }
};
int main() {
    Big a1(5,4);
    cout << a1.v << "," << a1.k << endl;
    return 0;
}
可能是要这么写吧
1