Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2014, 11:00   #1
Nich2000
 
Аватар для Nich2000
 
Регистрация: 23.07.2009
Сообщений: 8
По умолчанию Перегрузка операторов

Доброго времени суток!
У меня не получается корректно перегрузить некоторые операторы.

Если использовать как хотелось бы:
Код:
arr = tmp;
arr[0] = 123;
cout << arr;
Не работает.

А если использую так:
Код:
arr->operator=(tmp);
arr->operator[](0) = 123;
operator<<(cout, arr);
То, все нормально.

Вот, описание класса
Код:
template<typename T>
class TArray
{
  private:
    size_t size;
    T* array;
  public:
    //----------------------------------------------------------------
    // Конструктор по умолчанию
    TArray(){size = 0; array = new T[size];};
    //----------------------------------------------------------------
    // Конструктор с размером
    TArray(const size_t sz){size = sz; array = new T[size];};
    //----------------------------------------------------------------
    // Конструктор копий
    TArray(const TArray *a)
      {
        size = a->size;

        array = new T(size);

        for(size_t i = 0; i < size; i++)
          array[i] = a->array[i];
      };
    //----------------------------------------------------------------
    // Деструктор
    ~TArray(){delete []array;};
    //----------------------------------------------------------------
    // Размер
    size_t Size(){return size;};
    //----------------------------------------------------------------
    // Заполняем случайно
    void FillRandom(size_t range)
    {
      for(size_t j = 0; j < size; j++)
        array[j] = random(range);
    };
    //----------------------------------------------------------------
    // Оператор []
    T& operator[](const size_t i){return array[i];};
    //----------------------------------------------------------------
    // Оператор вывода
    friend ostream& operator<<(ostream& os, const TArray<T>& a);
    //----------------------------------------------------------------
    // Оператор =
    TArray* operator=(const TArray<T>* a)
      {
        if(this == a) return this;

        size = a->size;
        array = new T(size);
        
        for(size_t i = 0; i < size; i++)
          array[i] = a->array[i];

        return this;
      };
    //----------------------------------------------------------------
};
//--------------------------------------------------------------------
Перегрузка <<
Код:
template<typename T>
ostream& operator<<(ostream& os, const TArray<T>& a)
{
  for(size_t i = 0; i < a.size; i++)
    os << a.array[i] << "  ";
  os << endl;
  return os;
};
Подскажите, в чем может быть загвоздка.
Вначале был Бит, затем Байт и только потом появилось Слово...
Nich2000 вне форума Ответить с цитированием
Старый 20.04.2014, 15:16   #2
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

И не будет работать так как вам хочется: тут уже вторгаются операторы из глобальной области видимости. Попробуйте (если есть класс, мне лень разбираться) указать класс, потом двоеточие, потом оператор (так компилятор будет знать какой класс).
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Старый 21.04.2014, 10:03   #3
Nich2000
 
Аватар для Nich2000
 
Регистрация: 23.07.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Airhand Посмотреть сообщение
тут уже вторгаются операторы из глобальной области видимости.
Да, я думал об этом. В случае с cout в принципе логично.
Меня больше смущает это:
Код:
arr[0] = 123; // Не работает
arr->operator[](0) = 123; // Работает
Как правильно сделать, ума не приложу.
Я программист на Delphi, и не могу перестроить свой мозг для таких трюков.
Вначале был Бит, затем Байт и только потом появилось Слово...
Nich2000 вне форума Ответить с цитированием
Старый 21.04.2014, 10:32   #4
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Потаму, что в 1 случае использется глобальный оператор, поэтому и не пашет, а во втором случае явно указано, что должен вызываться оператор, описанный для класса, поэтому и пашет.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Старый 21.04.2014, 15:38   #5
Nich2000
 
Аватар для Nich2000
 
Регистрация: 23.07.2009
Сообщений: 8
По умолчанию

Как правильно вызвать перегруженный оператор []?
Вначале был Бит, затем Байт и только потом появилось Слово...
Nich2000 вне форума Ответить с цитированием
Старый 21.04.2014, 16:11   #6
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

УжО ж мнУ написал, как во втором случае. Можно ещё исхитриться и указать класс или засунуть всё в пространство имён, а потом написать:
{
using namespace ...;

}
Главное в фигурных скобках опять не написать первый вариант (хотя в этом не уверен).
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов SmileOn Visual C++ 5 28.04.2012 11:40
Перегрузка операторов Granus Общие вопросы C/C++ 2 11.04.2012 20:52
c++ перегрузка операторов pavel282 Помощь студентам 6 11.09.2010 20:35
Перегрузка операторов(С++) Сергей AfeR Помощь студентам 0 16.06.2010 18:34
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15