![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Vadimka1234 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.9.2012 Репутация: нет Всего: нет |
Всем привет, недавно начал изучать С++. Вопрос в следующем: я хочу создать безопасный массив с проверкой выхода за границы диапазона, вот код.
Проблема в этой строчке: testClass* r=sArr[0]; Почему-то, по непонятным мне причинам sArr[0] имеет тип SafeArray<testClass>, ни как не пойму в чем проблема. Подскажите плиз. |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Потому что sArr - это указатель, а не объект. Поэтому sArr[0] - это разименование указателя и обращение к объекту SafeArray<testClass>, расположенному в нулевом смещении от адреса sArr, а не вызов перегруженного operator[]. Объявляйте в таких случаях переменные на стеке, не нужно здесь выделять память вручную.
|
|||
|
||||
Vadimka1234 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.9.2012 Репутация: нет Всего: нет |
Теперь понял, спасибо сам бы я до этого конечно долго бы докапывался
Добавлено через 9 минут и 22 секунды Еще одни вопрос, при переопределении оператора я возвращаю тип T*& для того чтобы можно было писать что-то вроде sarr[index]=new testClass(), но если возвращать T*, то такая возможность отпадает. В инете читал, что проблема в том, что T* в данном случае не будет Lvalue. Но почему я могу написать например так int* i; int p=new int(4); i=p; |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Я вряд ли нормально смогу объяснить данный момент, но постараюсь. У Вас в классе храниться массив указателей. В случае, когда Вы возвращаете из функции T*, получается, что происходит разыменование указателя, и возвращается копия указателя. Понятно или не очень?) Представим, что в ячейке 0 у Вас хранится указатель на 20 ячейку. Получается, что, возвращая T*, вы получаете указатель на 20 ячейку, отвязанный от Вашей нулевой ячейки. Именно поэтому нужно возвращать ссылку, тогда указатель копироваться не будет. |
|||
|
||||
Vadimka1234 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.9.2012 Репутация: нет Всего: нет |
Да кажется понял, а можно в случае T* поймать создание копии указателя в конструкторе копирования?
В данном случае сюда я не попадаю testClass(const testClass& tCl) { Console::WriteLine("копирования конструктор"); } Это наверное потому, что реальный объект так и остается лежать в 20 ячейке, а создается только еще одна копия на указатель на 20 ячейку. |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |