Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кастирование ссылки указателя 
:(
    Опции темы
46&two
Дата 9.12.2004, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



Код такой:

Код

#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 *), то, ясное дело, указатель на объект не обнуляется.

Как быть?
PM MAIL   Вверх
DENNN
Дата 9.12.2004, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Код

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


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



Это сообщение отредактировал(а) DENNN - 9.12.2004, 13:28
PM ICQ   Вверх
46&two
Дата 9.12.2004, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



не годится. нужно, чтобы функция foo() принимала в качестве параметра указатель без явного приведения типа.
PM MAIL   Вверх
azesmcar
Дата 9.12.2004, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

#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;
}


Сойдет???

Это сообщение отредактировал(а) azesmcar - 9.12.2004, 17:07
PM   Вверх
46&two
Дата 9.12.2004, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



вполне себе. спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.