2016-09-02 65 views
3

我有一個重載構造函數的類,沒有默認的構造函數。重載的構造函數實質上做了相同的事情,但在提供的參數上有所不同。比方說,我有一個類如下 -在重載的構造函數中重複代碼

struct info { 
    int one; // must be filled 
    int two; // can be empty 
    int three; // can be empty 
} 

class A { 
    int a; 
    double b; 
    float c; 
    info I; 

    public: 

    A(a,b,c,one) : 
     a(a), 
     b(b), 
     c(c) 
    { 
     // some processing 
     I.one = one; 
     // some other processing 
     .... 
    } 

    A(a,b,c,i) : 
     a(a), 
     b(b), 
     c(c), 
     I(i) 
    { 
     // some processing 
     // some other processing 
     .... 
    } 

} 

的處理和一些處理部分被重複和略微依賴於特定的路徑,這是經常修改,迫使我們做兩地相同的,相同的變化。

這可以通過某種方式簡化爲相同的構造函數嗎?我希望能夠與構造函數委託做些事情,但無法想出一個聰明的方法來做到這一點:/

+0

請說明downvotes ..我會很高興地改善我的問題:) –

+0

我不知道,但它可能是由於你未能在構造函數中指定參數的類型(即, 'A(int a,int b,...'),或者只是你有很多代碼的事實....?這個問題對我來說似乎完全合理。 –

回答

6

這可以通過某種方式簡化爲相同的構造函數嗎?

是的。在C++ 11委託構造函數

例如:

class Foo { 
public: 
    Foo(char x, int y) {} 
    Foo(int y) : Foo('a', y) {} // Foo(int) delegates to Foo(char,int) 
}; 

編輯:

按照要求,把你的例子:

class A { 
private: 
    A (int _a, double _b, float _c) : a(_a), 
            b(_b), 
            c(_c) { 
    // This constructor does a lots of stuff... 
    } 

public: 
    A (int _a, double _b, float _c, int _one) : A(_a, _b, _c) { 
    I.one = _one 
    // This constructor does nothing 
    // Because A(_a, _b, _c) already does everything 
    } 

    A (int _a, double _b, float _c, info _info) : A(_a, _b, _c) { 
    I = _info; 
    // This constructor does nothing 
    // Because A(_a, _b, _c) already does everything 
    } 
}; 
+0

你可以用我的例子嗎?由於我有一個棘手的情況,1重載是結構本身,而另一個版本是其成員。 –

+1

@hg_git:你可以創建一個私有構造函數來完成公共構造函數的使用 –

+0

這是一個有效的語法'I.one(one)'? – Slava

2

只需創建一個合適的構造函數爲info

struct info { 
    int one; // must be filled 
    int two; // can be empty 
    int three; // can be empty 

    info(int lone, int ltwo = 0, int lthree = 0) : 
     one(lone), two(ltwo), three(lthree) {} 
}; 

那麼你只需要一個構造函數爲class A接受info,或者你可以表達明確:

A(int la, double lb, double lc, int one) : 
    A(la, lb, lc, info(one)) 
{ 
} 
+1

如果'info'可以是非聚集的,這是唯一可行的。如果它需要是一個聚合,你不能提供一個構造函數。 – NathanOliver

+0

@NathanOliver我在這裏感覺很愚蠢,但是你能否在解釋你的意思時說 - 如果它需要是一個聚合體..什麼是聚合體.. –

+1

@hg_git參見:http:// stackoverflow。com/questions/4178175/what-are-aggregates-and-pod-and-how-why-are-special- – NathanOliver