2011-09-08 176 views
1

對於有多個參數的構造函數參數多...隱式轉換

例如:

class C { 
public: 
    C(int a=1, int b=2){ cout << a << ", " << b << "\n"; } 
} 

int main(){ 
    C a(10), b = 20; 
} 

output: 
10, 2 
20, 2 

如何我只是將值分配給第二個參數?所以我可以在不知道默認值的情況下得到「1,20」?或者是,我必須始終賦予前面我可以使用參數之前的論點的價值?

而我該如何隱式分配所有參數?如果我不能這樣做,爲什麼?對於上面的例子(因爲我是C++的新手),我曾經認爲我會得到「10,20」作爲輸出。

回答

2

或者說,我必須始終賦值前面的參數,然後才能使用參數?

是的。否則,編譯器應該如何知道哪個參數應該用於哪個參數?

但是,有辦法可以做到這一點。例如,

struct C { 
    enum { DefaultA = 1, DefaultB = 2 }; 
    C(int a = DefaultA, int b = DefaultB) { /* ... */ } 
}; 

C object(C::DefaultA, 20); 

或者,如果你有很多的不同參數的 「默認:」

struct CParams { 
    int a, b; 
    CParams() : a(1), b(2) { } 
}; 

struct C { 
    C(CParams x) { /* ... */ } 
}; 

CParams params; 
params.b = 20; 
C object(params); 
1

C++不支持命名的參數。你必須指定第一個。

此外,主函數中的變量名稱b與構造函數定義中的b完全分離。命名中隱含的任何關係都沒有關係。

0

通常在OOP中,每個對象實例都包含(並表示)一個狀態。 因此,最好的方法是定義一個訪問函數,如 void setB(int newBvalue); 並且還可以將b作爲私有成員。

如果在同一個對象的所有實例中共享「b」,則考慮保存一個靜態變量。

1

我有同樣的想法(Convienient C++ struct initialisation - 也許你會發現你更喜歡有什麼)前一段時間,但就在剛纔,讀你的問題,我想了一個辦法真正做到這一點。但它是一些額外的代碼,所以如果真的值得的話,問題依然存在。我剛剛實施它非常粗略,我不自豪我的名字選擇(我通常不使用_,但它晚了)。無論如何,這是你如何能做到這一點:

#include <iostream> 

struct C_members { 
    int a; 
    int b; 
    C_members(int _a, int _b) : a(_a), b(_b) {} 
}; 
class C_init { 
    public: 
    virtual C_members get(C_members init) const { 
     return init; 
    } 
}; 
class C_a : public C_init { 
    private: 
    int a; 
    public: 
    C_a(int _a) : a(_a) {} 
    C_members get(C_members init) const { 
     init.a = a; 
     return init; 
    } 
}; 
class C_b : public C_init { 
    private: 
    int b; 
    public: 
    C_b(int _b) : b(_b) {} 
    C_members get(C_members init) const { 
     init.b = b; 
     return init; 
    } 
}; 
class C : private C_members { 
    private: 
    static const C_members def; 
    public: 
    C(C_init const& ai = C_init(), C_init const& bi = C_init()) : C_members(ai.get(bi.get(def)).a, bi.get(ai.get(def)).b) { 
     std::cout << a << "," << b << std::endl; 
    } 
}; 

const C_members C::def(1,2); // default values 

// usage: 
int main() { 
    C c1(C_b(77)); // 1,77 
    C c2(C_a(12)); // 12,2 
    C c3(C_b(5),C_a(6)); // 6,5 
    return 0; 
} 

有很多的東西可以改善(使用模板(代碼還原)和用get方法常量裁判),但你的想法。

作爲一項額外功能,您幾乎可以實現pimpl成語(只需很少的努力就可以將其擴展爲實際的pimpl設計)。

+0

「C_a(int a):a(a){}」中的「a(a)」意味着將「a」的值傳遞給C_members中的變量「a」嗎? – yeeen

+0

不,'a(a)'的意思是「把*參數*的值'a'和構造我的* member *'a'」。這就是通常對傳遞值進行初始化的方式(至少,我喜歡這樣做)。 – bitmask

+0

我改變了一些變量名,所以更明顯的是發生了什麼。 – bitmask