2012-07-27 31 views
0

我有我的代碼中定義的複製構造函數正在初始化正在創建的對象的數據成員。 現在,如果我不得不改變幾個變量的值,我正在寫一個新的副本。 所以我的問題是,而不是再次編寫相同的代碼,我可以只初始化特定的不同數據成員和其他人,我可以在我的ctor方法中調用定義的一個ctor。調用複製ctor和另一個ctor

例如: 已經存在

A::A(const A& cpy) 
{ 
a=cpy.a; 
b=cpy.b; 
c=cpy.c 
} 

現在我想寫我的構造函數作爲

A::A(const A& cpy, bool x) 
{ 
    if(x) 
     a=something; 
    else 
     a =cpy.a 
    //call first ctor for other variables (b and c) 
} 

感謝 魯奇

+0

爲什麼不使用'init(a,b,c)'函數? – 2012-07-27 09:51:49

+0

這段代碼絕對不是合法的C++。 – 2012-07-27 09:57:18

回答

1

由於C++ 11你可以做這樣的事情:

class A 
{ 
    public: 

      A(const A& cpy) { a=cpy.a; b=cpy.b; c=cpy.c; } 
      A(const A& cpy, bool x): A(cpy) { a = something_else; } 
} 
+0

只是尋找一個有用的鏈接來作出這個答案。例如:http://www.nullptr.me/2012/01/17/c11-delegating-constructors/#.UBJlv_ni58E此外,這是可用的GCC 4.7(搜索「委託構造函數」)http://gcc.gnu .org/projects/cxx0x.html – BoBTFish 2012-07-27 09:59:06

+0

你的第一個構造函數看起來非常需要一個初始化列表:-) – 2012-07-27 09:59:56

0

你可以通過在你的拷貝構造函數默認參數一樣

A::A(const A& cpy, bool x = false) 
{ 
    if(x) 
     a=something; 
    else 
     a =cpy.a 
    //call first ctor for other variables (b and c) 
} 

,你可以調用它像

A objA; 
A b(objA, true);  // b gets a shallow copy of a 
0

拷貝構造函數可以使用默認進一步爭論:

A::A(A const & rhs, bool x = false) 
{ 
    a = x ? FOO : BAR; 
} 

也許這可以幫助您簡潔地編寫代碼...

0

在C++ 11你可以調用構造函數在初始化列表:

class Foo 
{ 
public: 
    Foo(int a) {} 
    Foo(int a, int b) : Foo(a) {} 
}; 

然而,有一個與你的代碼中的問題,那就是你嘗試創建一個拷貝構造函數,一個額外的參數。它不再是一個拷貝構造函數,而是一個具有兩個參數的普通構造函數。