проблемы с dynamic_cast - PullRequest
       30

проблемы с dynamic_cast

1 голос
/ 19 июня 2010

У меня есть этот фрагмент кода:

void addLineRelative(LineNumber number, LineNumber relativeNumber) {
            list<shared_ptr<Line> >::iterator i;
            findLine(i, number);
            if(i == listOfLines.end()){
                throw "LineDoesNotExist";
            }

   line 15  if(dynamic_cast<shared_ptr<FamilyLine> >(*i)){
                cout << "Family Line";
            } else {
                throw "Not A Family Line";
            }
        }

У меня есть класс Line и производные от него FamilyLine и RegularLine, поэтому я хочу найти FamilyLine

моя программа не работает в строке 15, я получаю сообщение об ошибке

cannot dynamic_cast target is not pointer or reference

Может кто-нибудь, пожалуйста, помогите, спасибо заранее

изм

Я попробовал это:

shared_ptr<FamilyLine> ptr(dynamic_cast<shared_ptr<FamilyLine> >(*i));
if(ptr){
    //do stuff
}

та же ошибка

изм

void addLineRelative(LineNumber number, LineNumber relativeNumber) {
        list<shared_ptr<Line> >::iterator i;
        findLine(i, number);
        if(i == listOfLines.end()){
            throw "LineDoesNotExist";
        }

        shared_ptr<FamilyLine> ptr(dynamic_pointer_cast<FamilyLine>(*i));
        if (ptr){
            cout << "Family Line";
        } else {
            throw "Not A Family Line";
        }
    }

получить эту ошибку

Multiple markers at this line
    - `dynamic_pointer_cast' was not declared in this 
     scope
    - unused variable 'dynamic_pointer_cast'
    - expected primary-expression before '>' token

1 Ответ

4 голосов
/ 19 июня 2010

shared_ptr неявно преобразуется в указатель - это объект типа класса - и dynamic_cast, static_cast и const_cast все работают только с указателями.

Хотя вы можете использоватьdynamic_cast на shared_ptr<T>::get(), лучше использовать dynamic_pointer_cast<FamilyLine>() вместо этого, так как в противном случае вы можете случайно ввести double- delete s:

Возвращает:
*Когда dynamic_cast<T*>(r.get()) возвращает ненулевое значение, объект shared_ptr<T>, который хранит его копию и делит владение с r;
* В противном случае, пустой объект shared_ptr<T>.
[...]
Примечания: эквивалентное на первый взгляд выражение

shared_ptr<T>(dynamic_cast<T*>(r.get()))

в конечном итоге приведет к неопределенному поведению, пытаясь удалить один и тот же объект дважды.

Например:

shared_ptr<FamilyLine> ptr(dynamic_pointer_cast<FamilyLine>(*i));
if (ptr) {
    // ... do stuff with ptr
} 
...