Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > кастирование ссылки указателя


Автор: 46&two 9.12.2004, 11:56
Код такой:

Код

#include <iostream>
using namespace std;

class base
{};

class child : public base
{};

void foo(base *&p)
{
     p = 0;
}

int main()
{
base * pb = new base();
child* pc = new child();

cout << "before: " <<"pb=" << pb << endl << "pc=" << pc << endl;
foo(pb);
foo(pc);
cout << "after: " <<"pb=" << pb << endl << "pc=" << pc << endl;

return 0;
}


gcc выдает ошибку на стадии компиляции: не могу, дескать, преобразовать child*& к base*&.
Вариант с двумя указателями тоже не проходит smile
Если же foо описать как foo(base *), то, ясное дело, указатель на объект не обнуляется.

Как быть?

Автор: DENNN 9.12.2004, 13:27
Код

void foo(base *&p)
{
     p = 0;
}


   foo(pb);
   foo( (base*) pc);


Автор: 46&two 9.12.2004, 14:02
не годится. нужно, чтобы функция foo() принимала в качестве параметра указатель без явного приведения типа.

Автор: azesmcar 9.12.2004, 17:06
Код

#include <iostream>

using namespace std;

class base
{};

class child : public base
{};

#define foo(X) _foo(reinterpret_cast<void**>(&X))

void _foo(void** p)
{
    *p = 0;
}

int main()
{
base * pb = new base();
child* pc = new child();

cout << "before: " <<"pb=" << pb << endl << "pc=" << pc << endl;
foo(pb);
foo(pc);
cout << "after: " <<"pb=" << pb << endl << "pc=" << pc << endl;

return 0;
}


Сойдет???

Автор: 46&two 9.12.2004, 17:11
вполне себе. спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)