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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> очередной си++изм 
:(
    Опции темы
manu
Дата 21.11.2004, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



На эту фичу я наткнулся когда попытался запихнуть умные указатели в вектор. Т.е. есть у меня умный указатель:

template<class T> class ptr: public chain<T> {
private:
T *ptr;
public:
ptr(ptr<T> &p) { ... }
...
};

В принципе, с первого взгляда понятно почему у конструктора копирования параметр не const. Мы же ведь не можем получить не константный указатель из константного.

И мне нужно было сделать вектор этих вот указателей:

class A {
...
};

vector< ptr<A> > a;

Но компилятор не дал мне сделать этот вектор. Дело в том, что у функции push_back() и подобных параметр константный. Т.е. если если нет конструктора копий вида ptr(const ptr<T> &p), то вектор мы использовать не можем!

Тут у меня появилась гипотеза. На уровне интуиции.

typedef int *ptr_t;
ptr_t x=new int;
const ptr_t& x1=x1;
ptr_t x2=x1;

VC++ 7.1 это компилирует! для меня это было откровением.
В принципе все понятно. Наш reference константный, но указатель, к которому он относится не константый. Поэтому все теперь работаетsmile
А конструктор у меня теперь такой:

ptr(const ptr_t &p):
chain_t(p.value,&p) {
}

Вот так вот.
PM   Вверх
manu
Дата 21.11.2004, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Интересно, что в реализации STL от P.J. Plauger'а из Visual C++ конструкторы auto_ptr выглядят так:

explicit auto_ptr(
Type* _Ptr = 0
) throw( );
auto_ptr(
auto_ptr<Type>& _Right
) throw( );
auto_ptr(
auto_ptr_ref<Type> _Right
) throw( );
template<class Other>
auto_ptr(
auto_ptr<Other>& _Right
) throw( );
PM   Вверх
manu
Дата 21.11.2004, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Но самое интересное, что у Страуструпа конструктор такой: auto_ptr(const auto_ptr<T> &)!
PM   Вверх
bel_nikita
Дата 21.11.2004, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



manu
Цитата
Код
typedef int *ptr_t;
ptr_t x=new int;
const ptr_t& x1=x1;
ptr_t x2=x1;
VC++ 7.1 это компилирует! для меня это было откровением.

Не обязательно VC++ 7.1. Другие тоже будут компилировать smile
Дело в том, что при использовании typedef int *ptr_t; у тебя уже не указатель на константу, а получается константный указатель.

Пару поясняющих примеров и отличий константного указателя и указателя на константу:
Код

 // указатель на константу
 const int* p;
 int i = 111;
 p = &i;       // можно
 // *p = 123;  // нельзя
 //int* p3 = p;  // нельзя  

 // константный указатель
 int i1 = 222;
 int* const p1 = &i1;
 //p1 = &i;    // нельзя
 *p1 = 2323;   // можно
 int* p2 = p1; // можно


Еще многие думаю, что:
Код
#define PINT  int*
и
Код
typedef int* PINT;
эквивалентны.
Но как показывает практика - НЕТ smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
alien_by
Дата 30.11.2004, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

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



Цитата
Мы же ведь не можем получить не константный указатель из константного.


Вообще-то можем... smile
Код

const int* cptr = ...;
int* ptr = cptr;                                 // ошибка
int* ptr = const_cast<int*>(cptr);   // всё путём...

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

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

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

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

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


 




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


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

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