Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
#1

Присвоение указателей - C++

16.05.2013, 22:14. Просмотров 1017. Ответов 11
Метки нет (Все метки)

Здарствуйте.

Например я пишу пользовательский контейнер (класс шаблон). Узел будет содержать ключ, данные и т.д.
я объявляю ключ константным!!!

C++
1
2
3
4
5
6
7
8
9
10
11
template <class t1>
struct hnode
{
const t1 key;
hnode(t1 val1)
: key(val1)
{
t1 val2;
val2 = key;
}
};
А вот в чем вопрос.
В качестве аргумента шаблона, я переадю например char *. В конструкторе, указателю на неконстантные данные присваиваю константный указатель. При реализации подобного с явными типами, генерируется исключение о невозможности преобразования типов.
Почему все работает с шаблонами, или это особенность C++ Builder 6?
Да и стоит ли вообще делать ключ константным (инкапсуляция и все такое)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2013, 22:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Присвоение указателей (C++):

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей - C++
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Различия указателей char* от указателей других типов - C++
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

11
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
16.05.2013, 22:42 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template<typename T>
struct Containter
{
    Containter(T key) : key(key) {}
    const T key;
};
 
int main()
{
    char * str = "Hello";
    Containter<char*> c(str);
 
    std::cout << c.key << std::endl;
    std::cin.get();
 
    return 0;
}
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
16.05.2013, 22:45  [ТС] #3
так ты на вопрос не ответил.
Я спрашивал: почему компилятор не ругается при присвоении указателю на неконстантные данные указателя на константные, при шаблонах. С явеными типами ругается.
0
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
16.05.2013, 22:47 #4
Код покажи, ибо мне сложно понять тебя)
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
16.05.2013, 22:52  [ТС] #5
я код уже показывал.
C++
1
2
3
4
5
6
7
8
9
10
11
template <class t1> //в качестве аргумента я передаю char *
struct hnode
{
const t1 key; //это указатель на константные данные типа char
hnode(t1 val1)
: key(val1)
{
t1 val2; //это указатель на неконстантные данные
val2 = key; //Здесь должны быть ошибка, но ее нет (Cannot convert const char * to char *) 
}
};
При написании этого в main, генерируется ошибка:

C++
1
2
3
int q = 123;
const int *ptr1 = &q;
int *ptr2 = ptr1;
Так вот вопрос:
Почему все работает с шаблонами, или это особенность C++ Builder 6?
Да и стоит ли вообще делать ключ константным (инкапсуляция и все такое)?
0
stima
487 / 339 / 39
Регистрация: 22.03.2011
Сообщений: 1,084
Завершенные тесты: 2
16.05.2013, 23:01 #6
C++
1
const t1 key; //это указатель на константные данные типа char
Это константный указатель на данные.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 23:04 #7
шаблонные аргументы работают не так, как макросы.
если t1 - это int*, то
const t1 key; - это не const int* key; т.е. не указатель на константные данные.
это константа типа t1. т.е. key изменять нельзя, он всегда будет указывать в одно и то же место. но то, но что он указывает изменять можно.
1
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
16.05.2013, 23:13  [ТС] #8
То есть key - есть константный указатель на неконстантные данные?

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

C++
1
2
3
4
5
6
7
8
9
struct h
{
char *const ptr1;
h(char *ptr2)
:ptr1(ptr2)
{
char *ptr3 = ptr1; //Вот ошибки нет и в main ее нет
}
};
но при

C++
1
const char *ptr1;
получаем [C++ Error] Unit1.cpp(31): E2034 Cannot convert 'const char *' to 'char *'

значит это все таки указатель на константные данные.

Добавлено через 1 минуту
значит это поблашки шаблонов? и можно спокойно константничать?

Добавлено через 14 секунд
Да и стоит ли вообще делать ключ константным (инкапсуляция и все такое)?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.05.2013, 23:19 #9
Цитата Сообщение от no_wearines Посмотреть сообщение
Да и стоит ли вообще делать ключ константным (инкапсуляция и все такое)?
Да, стоит, но это не имеет отношения к инкапсуляции.

Цитата Сообщение от no_wearines Посмотреть сообщение
Почему все работает с шаблонами, или это особенность C++ Builder 6?
Нет, это особенность Си++: const char* можно неявно и безошибочно кастовать к char* (но предупреждений обычно отсыпают). Ну и про то, что у вас неправильное определение, вам уже сказали (правда, это всё равно не поможет в случае char*).
1
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 23:20 #10
const char* ptr1; - указатель на константу
char* ptr3; - указатель на не константу.
ptr3 = ptr1; ошибка. потому что тут typeof(ptr3) != typeof(ptr1) и нет неявных преобразований
из typeof(ptr1) в typeof(ptr3). (хотя есть обратное преобразование из typeof(ptr3) в typeof(ptr1))

char* const ptr1; - константный указатель на неконстанту
char* ptr3; - указатель на не константу.
ptr3 = ptr1; // ок. потому что и то и другое указывает на неконстанту.

если второй случай просто с интами переписать, то получается:
const int val1 = 0; просто константа
int val3 = val1; ну переменная может инициализироваться константой.

или более общий случай с типом Т
const T val1 = T();
T val3 = val1; // ок
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
16.05.2013, 23:22  [ТС] #11
спасибо. прям как идиоту объяснили.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.05.2013, 23:33 #12
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Нет, это особенность Си++: const char* можно неявно и безошибочно кастовать к char* (но предупреждений обычно отсыпают).
Вернее, можно строковые литералы (которые имеют тип const char*) кастовать. И то, под честное слово, что они фактически останутся константами. И в Си++11 уже нельзя.
0
16.05.2013, 23:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 23:33
Привет! Вот еще темы с ответами:

Как обойтись без указателей и указателей на указатель? - C++
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace...

Создание массивов указателей на массивы указателей - C++
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор ругается на то что не может...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей - C++
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе написания, но уже наверное есть ошибки....

Массив указателей на массив строк и сортировка массива указателей - C++
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru