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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с приведением типа 
:(
    Опции темы
Vadimka1234
Дата 3.7.2014, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет, недавно начал изучать С++. Вопрос в следующем: я хочу создать безопасный массив с проверкой выхода за границы диапазона, вот код.

Код

public class testClass
{
public:
    testClass()
    {
        Console::WriteLine("обычный конструктор");
    }

    testClass(const testClass& tCl)
    {
        Console::WriteLine("копирования конструктор");
    }

    ~testClass()
    {
        Console::WriteLine("деструктор");
    }
};

template<class T>
public class SafeArray
{
private:
    T** arr;
    int entires;
    static T* dummy;
public:
    SafeArray():arr(NULL),entires(0)
    {
    }

    ~SafeArray()
    {
        free(arr);
    }

    SafeArray(int size):arr(new T*[size]),entires(size)
    {
        for (int i=0;i<size;i++)
            arr[i]=new T();
    }

    T*& operator[](int index)
    {
        if (index>0&&index<entires)
        {
            return arr[index];
        }
        else
        {
            return dummy;
        }
    }
};





int main(array<System::String ^> ^args)
{
    SafeArray<testClass>* sArr=new SafeArray<testClass>(1);
    testClass* r=sArr[0];
    Console::ReadLine();
    return 0;
}



Проблема в этой строчке:

testClass* r=sArr[0];

Почему-то, по непонятным мне причинам sArr[0] имеет тип SafeArray<testClass>, ни как не пойму в чем проблема. Подскажите плиз.
PM MAIL   Вверх
Guinness
Дата 3.7.2014, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому что sArr - это указатель, а не объект. Поэтому sArr[0] - это разименование указателя и обращение к объекту SafeArray<testClass>, расположенному в нулевом смещении от адреса sArr, а не вызов перегруженного operator[]. Объявляйте в таких случаях переменные на стеке, не нужно здесь выделять память вручную.
PM MAIL   Вверх
Vadimka1234
Дата 3.7.2014, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Теперь понял, спасибо сам бы я до этого конечно долго бы докапывался

Добавлено через 9 минут и 22 секунды
Еще одни вопрос, при переопределении оператора я возвращаю тип T*& для того чтобы можно было писать что-то вроде 

sarr[index]=new testClass(),

 но если возвращать T*, то такая возможность отпадает.
В инете читал, что проблема в том, что T* в данном случае не будет Lvalue.
Но почему я могу написать например так

int* i;
int p=new int(4);
i=p;
PM MAIL   Вверх
Guinness
Дата 3.7.2014, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vadimka1234 @  3.7.2014,  15:24 Найти цитируемый пост)
Еще одни вопрос, при переопределении оператора я возвращаю тип T*& для того чтобы можно было писать что-то вроде 

sarr[index]=new testClass(),

 но если возвращать T*, то такая возможность отпадает.
В инете читал, что проблема в том, что T* в данном случае не будет Lvalue.

Я вряд ли нормально смогу объяснить данный момент, но постараюсь. У Вас в классе храниться массив указателей. В случае, когда Вы возвращаете из функции T*, получается, что происходит разыменование указателя, и возвращается копия указателя. Понятно или не очень?)
Представим, что в ячейке 0 у Вас хранится указатель на 20 ячейку. Получается, что, возвращая T*, вы получаете указатель на 20 ячейку, отвязанный от Вашей нулевой ячейки. Именно поэтому нужно возвращать ссылку, тогда указатель копироваться не будет.
PM MAIL   Вверх
Vadimka1234
Дата 3.7.2014, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да кажется понял, а можно в случае T*  поймать создание копии указателя в конструкторе копирования?

В данном случае сюда я не попадаю

    testClass(const testClass& tCl)
    {
        Console::WriteLine("копирования конструктор");
    }

Это наверное потому, что реальный объект так и остается лежать в 20 ячейке, а создается только еще одна копия на указатель на 20 ячейку.


PM MAIL   Вверх
Guinness
Дата 3.7.2014, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vadimka1234 @  3.7.2014,  16:38 Найти цитируемый пост)
а создается только еще одна копия на указатель на 20 ячейку.

Да, копируется указатель, а не объект.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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