2015-02-27 2 views
0

Я использую smartptrs StD недавно, и я написал массовый код с «shared_ptr», есть некоторые проблемы в моей голове:станд :: shared_ptr головоломка в параметре функции

  1. Там есть два класса:

    class base{} 
    
    class drived: public base{} 
    

    , а также имеют две функции, как это:

    void fconst(const shared_ptr<classA>& obj){} 
    
    void f(shared_ptr<classA>& obj){} 
    

и эта функция для тестирования вызова:

void test() 

{ 

std::shared_ptr<drived> obj(std::make_shared<drived>()); 


f(obj);   // this is error in vc++, because type is not compatibility 

fconst(obj); // this is ok in vc++ 

} 

Я понимаю f вызов ошибки, но почему fconst вызов нормально?

Если использование base* имеет преимущество: когда функция принимает параметр base*, вызывающий может передать все дочерние элементы базы в качестве параметра.

и когда используется shared_ptr, есть ли похожий символ? fconst Поведение тестового вызова является надежным стандартом?

2. при shared_ptr передачи в параметрах функции, когда эти использования:

void f(const shaerd_ptr<classA> obj) 

void f(const shaerd_ptr<classA>& obj) 

void f(shaerd_ptr<classA> obj) 

void f(shaerd_ptr<classA>& obj) 

благодарит вас за вашу помощь!

EDIT: спасибо ~, и я также есть проблемы с последующим кодом:

недействительным тест()

{

станд :: shared_ptr OBJ (станд :: make_shared()) ;

f (obj); // это ошибка в vC++, потому что тип не совместим

fconst (obj); // это нормально в VC++

// продолжить ..

std::shared_ptr<base> objBase(std::make_shared<base>()); 

f(objBase); // this is ok, why? 

fconst(objBase); // this is ok after your answer 

}

+0

Вы не можете привязать ссылку, отличную от константы, к временному, но вы можете привязать ссылку const. –

+0

У меня есть обновленный вопрос, пожалуйста, помогите еще раз, спасибо! ~~ –

ответ

0

В первом примере, при вызове версии Const &, компилятор создает временную shared_ptr из вашего shared_ptr и поскольку временные пользователи могут связываться с константой &, все работает нормально.

Помните, однако, что это очень плохо, я предлагаю вам либо бросить свой shared_ptr с помощью statis_pointer_cast, либо принять ссылку на базу или указатель const raw.

#include <memory> 

using namespace std; 

class base{}; 

class drived: public base{}; 


void fconst(const shared_ptr<base>& obj){} 

void f(shared_ptr<base>& obj){} 

void f2(shared_ptr<base> a) {} 

int main() 
{ 

std::shared_ptr<drived> obj(std::make_shared<drived>()); 

auto h = std::statis_pointer_cast<base>(obj); 
f(h); 
f2(obj); 
fconst(obj); 

} 
+0

Благодарим вас за подробное описание, я знаю это сейчас! –

Смежные вопросы