2016-12-29 13 views
5

Tôi có một chức năng của loạiLàm thế nào để vượt qua một tham số mặc định cho std :: shared_ptr <PureVirtualClass>

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger) = 0; 

Và tôi muốn vượt qua một tham số mặc định với con trỏ NULL, một cái gì đó như:

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = NULL) = 0; 

Vì vậy, trong thực hiện, nếu logger là NULL Tôi không làm gì với nó, nếu không tôi sử dụng logger.

Tôi đã cố gắng để tìm kiếm một giải pháp nhưng không thể tìm thấy ..

UPD: khẳng định trùng lặp là không thích hợp, tôi đang hỏi về tham số NULL mặc định.

Có thể gcc 4.4 không hỗ trợ nullptr?

+1

Bạn nên sử dụng 'nullptr' thay của 'NULL'. Cái sau là một macro có khả năng '0', cái trước là chữ đúng cho một con trỏ rỗng. – CoryKramer

+0

Tôi đã thử nhưng cũng gặp phải lỗi biên dịch: lỗi: ‘nullptr’ không được khai báo trong phạm vi này –

+0

Câu hỏi này không trùng lặp với "Các hàm ảo có thể có tham số mặc định". Thực tế là hàm ảo không liên quan đến câu hỏi này. – IanPudney

Trả lời

1

Với C++ 11 trình biên dịch phù

này nên làm việc với một trong hai NULL hoặc nullptr sự là dạng thứ hai thì đề nghị cho C++. Điều kiện duy nhất là bạn biên dịch nó cho C++ 11 hoặc cao hơn (xem chú thích của jamek về các tùy chọn dòng lệnh cho gcc).

struct B { 
    virtual void foo(int blablabla, std::shared_ptr<LoggerInterface> logger = nullptr) = 0; 
}; 

struct D : B { 
    void foo(int blablabla, std::shared_ptr<LoggerInterface> logger) override { 
     std::cout << "foo: "<<blablabla<<" "<< logger<<std::endl; 
    } 
}; 

int main() { 
    D d; 
    B *b=&d; 
    b->foo(15); 
} 

Xem online demo

nhận xét quan trọng về các thông số mặc định

Lưu ý rằng các thông số mặc định là không thực chất với chức năng riêng của mình, nhưng với bối cảnh trong đó giá trị mặc định đã được công bố. Trong ví dụ trên:

  • b->foo(15) hoạt động, bởi vì chức năng được truy cập bằng cách sử dụng tham số mặc định được xác định là B.
  • d.foo(15) thậm chí sẽ không biên dịch, mặc dù cả hai đều đề cập đến cùng một chức năng. Điều này là do đối với lớp D tôi đã không khai báo giá trị mặc định trong định nghĩa ghi đè.
  • Tôi thậm chí có thể có một giá trị khác nhau mặc định cho cả hai định nghĩa (xem trong bản demo trực tuyến)

thực hiện limitated của C++ 11 trong GCC 4.4

Thật vậy, nullptr đã được giới thiệu với GCC 4.6 và bạn phải đợi GCC 4.8.1 cho full C++11 implementation.

Thực tế GCC 4.4.0 là released in 2009 và bản phát hành phụ đầu tiên sau khi phê chuẩn chính thức tiêu chuẩn trong august 2011 là GCC 4.4.7.

+0

cảm ơn, nhưng vấn đề là gcc 4.4 không hỗ trợ tất cả các tính năng C++ 11 như nullptr –

+0

[Thật vậy] (https: //gcc.gnu .org/projects/cxx-status.html # cxx11): nullptr chỉ được giới thiệu với 4.6! – Christophe

+0

@EricAbramov và Và [4.4.0 ngày trở lại năm 2009] (https://gcc.gnu.org/gcc-4.4/) và 4.4.7 là bản phát hành đầu tiên sau khi được phê duyệt chính thức của [C++ 11] (https://en.wikipedia.org/wiki/C%2B%2B11) – Christophe

2

Bạn chỉ có thể làm điều này:

virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = {}) = 0; 

Như bạn thấy here, cả hai constructor rỗng và nullptr cho cùng một kết quả, đó là:

Constructs a shared_ptr with no managed object, i.e. empty shared_ptr

Các vấn đề liên quan