2010-11-08 41 views
10

Tôi đã không thể tìm ra điều này. Thật dễ dàng để tạo ra hai ctors nhưng tôi muốn tìm hiểu nếu có một cách dễ dàng để làm điều này.Làm thế nào để vượt qua std :: bản đồ như một tham số constructor mặc định

Làm cách nào có thể chuyển một tham số mặc định cho một ctor, ví dụ: std::map.

Foo::Foo(int arg1, int arg2, const std::map<std::string, std::string> = VAL) 

Tôi đã thử 0, null, và NULL như VAL, không ai trong số các công việc, vì họ là tất cả các kiểu int, g ++ phàn nàn. Mặc định chính xác để sử dụng ở đây là gì?

Hoặc là loại điều này không phải là một ý tưởng hay?

Trả lời

22

Biểu thức chính xác cho VALstd::map<std::string, std::string>(). Tôi nghĩ rằng trông dài và xấu xí, vì vậy tôi có thể thêm một thành viên typedef công khai vào lớp học:

class Foo { 
public: 
    typedef std::map<std::string, std::string> map_type; 
    Foo(int arg1, int arg2, const map_type = map_type()); 
    // ... 
}; 

Và nhân tiện, ý của bạn là đối số constructor cuối cùng là tham chiếu? const map_type& có lẽ tốt hơn chỉ là const map_type.

+5

+1 cho là giải pháp duy nhất đặt giá trị mặc định trong khai báo * * và không có trong *Định nghĩa*. –

5

Bạn tạo tạm thời giá trị được khởi tạo. Ví dụ:

Foo::Foo(int arg1, 
     int arg2, 
     const std::map<std::string, std::string>& the_map = 
      std::map<std::string, std::string>()) 
{ 
} 

(Một typedef có thể giúp làm cho điều này dễ đọc hơn trong mã của bạn)

2

Đầu tiên, và tangentailly, bạn đang đi qua bản đồ bằng cách giá trị const, đó là vô nghĩa và có lẽ không những gì bạn thực sự muốn. Bạn có thể muốn vượt qua tham chiếu const, để bạn không tạo bản sao của bản đồ và đảm bảo rằng chức năng của bạn không sửa đổi bản đồ.

Bây giờ, nếu bạn muốn tham số mặc định của bạn là một bản đồ trống, bạn làm điều đó bằng cách xây dựng nó, như vậy:

Foo::Foo(int arg1, int arg2, const std::map<std::string, std::string>& = std::map<std::string, std::string>()) 
0

Kể từ C++ 11 bạn có thể sử dụng aggregate initialization:

void foo(std::map<std::string, std::string> myMap = {}); 

Ví dụ:

#include <iostream> 
#include <map> 
#include <string> 

void foo(std::map<std::string, std::string> myMap = {}) 
{ 
    for(auto it = std::begin(myMap); it != std::end(myMap); ++it) 
     std::cout << it->first << " : " << it->second << '\n'; 
} 

int main(int, char*[]) 
{ 
    const std::map<std::string, std::string> animalKids = { 
     { "antelope", "calf" }, { "ant", "antling" }, 
     { "baboon", "infant" }, { "bear", "cub" }, 
     { "bee", "larva" }, { "cat", "kitten" } 
    }; 

    foo(); 
    foo(animalKids); 

    return 0; 
} 
Các vấn đề liên quan