2011-08-04 85 views
5

是否可以“添加”到默认的拷贝构造函数?是否可以“添加”到默认的拷贝构造函数?

例如,对于这个类:

class A 
{ 
    public: 
     int a; 
     int* b; 
}; 

我只想写

A::A(const A& rvalue): 
    a(rvalue.a), 
    b(new int(*(rvalue.b))) 
{} 

没有a(rvalue.a)部分。

(忽略坏/丑陋的代码和可能的内存泄漏)

+0

这个默认的复制构造函数不是微不足道的 – Benoit

+0

为什么你需要这个?你不能改变班级吗? –

+1

这只是我有一个相当大的类,只有一个指针(我不能使用智能指针),所以我需要为它写一个拷贝构造函数,但大部分拷贝构造函数只是做默认的拷贝构造函数会做 –

回答

8

你问什么是不可能的。一旦声明了自己的拷贝构造函数,编译器就不会为你生成拷贝构造函数。这意味着你将无法简单地添加或增加默认的拷贝构造函数,因为它不会存在。这是全部或没有,可以这么说。

+0

请注意,这也是避免需要编写复制构造函数的操作(即:裸指针)的另一个原因。除非你没有别的选择。 –

5

这是不可能的。

struct A1 { 
    int a1; 
    int a2; 
    // .... 
    int aN; 
}; 

struct A:public A1 
{ 
    int* b; 
    A(const A& rhs): A1(rhs), b(new int(*(rhs.b))) {} 
}; 
1

你想要做的不是nartually由C++的支持是什么:你不能拥有但是,如果你想减少冗余代码为大量的“默认复制”字段,可以用随中级继承来实现一半的默认构造函数。

但是,你想要什么,实现可以通过下面的小技巧来实现:

请注意这个小演示下面有很多缺陷(内存泄漏等),所以它仅适用于笔画演示临时解决方案只:

//class A hasa large number date members(but all can take advantage of default 
//copy constructor 
struct A{ 
    A(int i):a(i){} 
    int a; 
    //much more data memberS can use default copy constructor all in class A 
}; 

//class B is simply wrapper for class A 
//so class B can use the default constructor of A 
//while just write copy constructor for a raw pointer in it's copy constructor 
//I think this is what OP want ? 
struct B 
{ 
    B(int i,int j):m_a(i),m_b(new int(j)){} 

    B(const B & rval): 
    m_a(rval.m_a), 
    m_b(new int(*rval.m_b)) 
    { 
    } 
    A  m_a; 
    int * m_b; 
}; 

int main() 
{ 
    B c(2,3); // a=2, *m_b=3 
    B d(c); //after copy constructor, a=2, *m_b=3 
} 
+0

我认为这已经被用户提及396672 –

+0

我不知道,因为我只是阅读你的问题,并自己动手解决这个问题...... – Gob00st