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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова о перегрузке оператора индексирования 
V
    Опции темы
AZNMABS
Дата 5.9.2013, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Предположим есть класс MyClass, в котором реализован массив целых чисел с контролем диапазона. В классе перегружен оператор индексирования [], т.е. можно написать так:
Код

MyClass ob(10);
ob[5] = 100;

Вопрос вот в чем: для встроенных типов массив можно объявить так:
Код

int myArray[10];

Обратите внимание, скобки квадратные.
В случае с классом, объект класса объявляется как показано выше, т.е.:
Код

MyClass ob(10);
 
(здесь скобки круглые).
Так вот, для данного конкретного класса (реализующий массив) можно ли объявить массив как для встроенных типов, т.е. так:
Код

MyClass ob[10];

Я пробовал так, но компилятор выдает кучу ошибок.

PM MAIL   Вверх
bsa
Дата 5.9.2013, 15:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(AZNMABS @  5.9.2013,  15:33 Найти цитируемый пост)
Я пробовал так, но компилятор выдает кучу ошибок.

Скорее всего, компилятор ругается на отсутствие у твоего класса конструктора без параметров. Только имей в виду, если твой класс MyClass это фактически массив, то MyClass ob[10] - это будет массив массивов.
PM   Вверх
AZNMABS
Дата 5.9.2013, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 5.9.2013,  15:09)
Скорее всего, компилятор ругается на отсутствие у твоего класса конструктора без параметров.

Вопрос возник при разборе примера из книги Х. Дейтел,  П. Дейтел "Как программировать на  C++", изд. 4, глава 8, п/п 8.8.  Учебный пример: класс массив.
Конструктора без параметров в оригинале не было, но я его включил. Привожу код. 
Файл array.h:
Код

#ifndef ARRAY1_H
#define ARRAY1_H
#include <iostream>
using namespace std;

class Array {
    friend ostream &operator<<(ostream &, const Array &);
    friend istream &operator>>(istream &, Array &);
public:
    Array(); 
    Array(int);
    Array(const Array &);
    ~Array();
    int getSize() const;
    const Array &operator=(const Array &);
    int operator==(const Array &) const;
    int operator!=(const Array &) const;
    int &operator[](int);
    static int getArrayCount();
private:
    int *ptr;
    int size;
    static int arrayCount;
};

#endif


файл array.cpp:
Код

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
#include "array.h"
using namespace std;

int Array::arrayCount = 0;
Array::Array()
{
    arrayCount++;
    size = 10;
    ptr = new int[size];
    assert(ptr != 0);
    for(int i = 0; i < size; i++)
        ptr[i] = 0;
}
Array::Array(int arraySize)
{
    arrayCount++;
    size = arraySize;
    ptr = new int[size];
    assert(ptr != 0);
    for(int i = 0; i < size; i++)
        ptr[i] = 0;
}
Array::Array(const Array &init)
{
    arrayCount++;
    size = init.size;
    ptr = new int[size];
    assert(ptr != 0);
    for(int i = 0; i < size; i++)
        ptr[i] = init.ptr[i];
}
Array::~Array()
{
    arrayCount--;
    delete [] ptr;
}
int Array::getSize() const {return size;}
const Array &Array::operator =(const Array &right)
{
    if(&right != this) {
        delete [] ptr;
        size = right.size;
        ptr = new int[size];
        assert(ptr != 0);
        for(int i = 0; i < size; i++)
            ptr[i] = right.ptr[i];
    }
    return *this;
}
int Array::operator ==(const Array &right) const
{
    if(size != right.size)
        return 0;
    for(int i = 0; i < size; i++)
        if(ptr[i] != right.ptr[i])
        return 0;

    return 1;
}
int Array::operator !=(const Array &right) const
{
    if(size != right.size)
        return 1;
    for(int i = 0; i < size; i++)
        if(ptr[i] != right.ptr[i])
            return 1;
    return 0;
}
int &Array::operator [](int subscript)
{
    assert(0 <= subscript && subscript < size);
    return ptr[subscript];
}
int Array::getArrayCount() {return arrayCount;}

ostream &operator<<(ostream &output, const Array &a)
{
    for(int i = 0; i < a.size; i++)
        output << a.ptr[i] << " ";
    return output;
}
istream &operator>>(istream &input, Array &a)
{
    for(int i = 0; i < a.size; i++)
        input >> a.ptr[i];
    return input;
}

Файл driver.cpp:
Код

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <Windows.h>
#include "array.h"
using namespace std;

int main()
{    
    setlocale(LC_ALL, "");
    SetConsoleCP( 1251 );
    SetConsoleOutputCP( 1251 );
    cout << "Количество созданных массивов = "
         << Array::getArrayCount() << endl;
    Array integers1(7), integers2; // так прекрасно все работает
//     Array integers1[7], integers2; // так не работает
    cout << "Количество созданных массивов = "
         << Array::getArrayCount() << endl;
    cout << "Размер созданного массива integers1 равен "
         << integers1.getSize() << endl
         << "Массив после задания начальных значений " 
         << integers1 << endl;
    cout << "Размер созданного массива integers2 равен "
        << integers2.getSize() << endl
        << "Массив после задания начальных значений " 
        << integers2 << endl;
    cout << "Введите 17 целых чисел:\n";
    cin >> integers1 >> integers2;
    cout << "Содержимое массивов после ввода:\n"
         << integers1 << endl
         << integers2 << endl;
    cout << "Проверка на равенство массивов\n";
    if(integers1 != integers2)
        cout << "Они не равны\n";
    else
        cout << "Массивы равны\n";
    Array integers3(integers1);
    cout << "Размер созданного массива integers3 равен "
        << integers3.getSize() << endl
        << "Массив после задания начальных значений " 
        << integers3 << endl;
    cout << "Присваивание массива integers2 массиву integers1\n";
    integers2 = integers1;
    cout << "integers1:\n" << integers1 << endl
         << "integers2:\n" << integers2
         << endl;
    cout << "Проверка на равенство массивов\n";
    if(integers1 == integers2)
        cout << "Массивы равны\n";
    else
        cout << "Массивы не равны\n";
    cout << "integers1[5] равен " << integers1[5] << endl;
    cout << "Присваивание 1000 элементу integers1[5]\n";
    integers1[5] = 1000;
    cout << "integers1:\n" << integers1
         << endl;
//    integers1[15] = 1000; // будет ошибка
    return 0;
}


Цитата

Только имей в виду, если твой класс MyClass это фактически массив, то MyClass ob[10] - это будет массив массивов.

Здесь, честно говоря, я Вас не понял. Если можно, по подробнее пожалуйста!

PM MAIL   Вверх
AZNMABS
Дата 6.9.2013, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Действительно получается массив массивов! Вот так работает:
Файл array.h:
Код

#ifndef ARRAY1_H
#define ARRAY1_H
#include <iostream>
using namespace std;

class Array {
    friend ostream &operator<<(ostream &, const Array &);
    friend istream &operator>>(istream &, Array &);
public:
    Array(int = 4);
    Array(const Array &);
    ~Array();
    int getSize() const;
    const Array &operator=(const Array &);
    int operator==(const Array &) const;
    int operator!=(const Array &) const;
    int &operator[](int);
    static int getArrayCount();
private:
    int *ptr;
    int size;
    static int arrayCount;
};

#endif


файл array.cpp:
Код

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
#include "array.h"
using namespace std;

int Array::arrayCount = 0;

Array::Array(int arraySize)
{
    arrayCount++;
    size = arraySize;
    ptr = new int[size];
    assert(ptr != 0);
    for(int i = 0; i < size; i++)
        ptr[i] = 0;
}
Array::Array(const Array &init)
{
    arrayCount++;
    size = init.size;
    ptr = new int[size];
    assert(ptr != 0);
    for(int i = 0; i < size; i++)
        ptr[i] = init.ptr[i];
}
Array::~Array()
{
    arrayCount--;
    delete [] ptr;
}
int Array::getSize() const {return size;}
const Array &Array::operator =(const Array &right)
{
    if(&right != this) {
        delete [] ptr;
        size = right.size;
        ptr = new int[size];
        assert(ptr != 0);
        for(int i = 0; i < size; i++)
            ptr[i] = right.ptr[i];
    }
    return *this;
}
int Array::operator ==(const Array &right) const
{
    if(size != right.size)
        return 0;
    for(int i = 0; i < size; i++)
        if(ptr[i] != right.ptr[i])
        return 0;

    return 1;
}
int Array::operator !=(const Array &right) const
{
    if(size != right.size)
        return 1;
    for(int i = 0; i < size; i++)
        if(ptr[i] != right.ptr[i])
            return 1;
    return 0;
}
int &Array::operator [](int subscript)
{
    assert(0 <= subscript && subscript < size);
    return ptr[subscript];
}
int Array::getArrayCount() {return arrayCount;}

ostream &operator<<(ostream &output, const Array &a)
{
    for(int i = 0; i < a.size; i++)
        output << a.ptr[i] << " ";
    return output;
}
istream &operator>>(istream &input, Array &a)
{
    for(int i = 0; i < a.size; i++)
        input >> a.ptr[i];
    return input;
}

Файл driver.cpp:
Код

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <Windows.h>
#include "array.h"
using namespace std;

int main()
{    
    setlocale(LC_ALL, "");
    SetConsoleCP( 1251 );
    SetConsoleOutputCP( 1251 );
    cout << "Количество созданных массивов = "
         << Array::getArrayCount() << endl;
    Array integers1[2], integers2;
    cout << "Количество созданных массивов = "
         << Array::getArrayCount() << endl;
    cout << "Размер созданного массива integers1[0] равен "
         << integers1[0].getSize() << endl
         << "Массив после задания начальных значений " 
         << integers1[0] << endl;
    cout << "Размер созданного массива integers2 равен "
        << integers2.getSize() << endl
        << "Массив после задания начальных значений " 
        << integers2 << endl;
    cout << "Введите целые числа для двух массивов integers1[0] и integers2:\n";
    cin >> integers1[0] >> integers2;
    cout << "Содержимое массивов после ввода:\n"
         << integers1[0] << endl
         << integers2 << endl;
    cout << "Проверка на равенство массивов\n";
    if(integers1[0] != integers2)
        cout << "Они не равны\n";
    else
        cout << "Массивы равны\n";
    Array integers3(integers1[0]);
    cout << "Размер созданного массива integers3 равен "
        << integers3.getSize() << endl
        << "Массив после задания начальных значений " 
        << integers3 << endl;
    cout << "Присваивание массива integers2 массиву integers1[0]\n";
    integers2 = integers1[0];
    cout << "integers1[0]:\n" << integers1[0] << endl
         << "integers2:\n" << integers2
         << endl;
    cout << "Проверка на равенство массивов\n";
    if(integers1[0] == integers2)
        cout << "Массивы равны\n";
    else
        cout << "Массивы не равны\n";
    cout << "integers1[0][2] равен " << integers1[0][2] << endl;
    cout << "Присваивание 1000 элементу integers1[0][2]\n";
    integers1[0][2] = 1000;
    cout << "integers1:\n" << integers1[0]
         << endl;
//    integers1[5] = 1000; // будет ошибка
    return 0;
}


Кстати, конструктор по умолчанию здесь не обязателен!
PM MAIL   Вверх
ТарасАтавин
Дата 6.9.2013, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AZNMABS @  5.9.2013,  14:33 Найти цитируемый пост)
Я пробовал так, но компилятор выдает кучу ошибок.
Не удивительно. Встроенные типы скалярны, чтоб сделать массив, надо указать это явно, что и выглядит, как 
Код
[10]
 (количество элементов), а твой MyClass - уже массив, что записано в самом классе, ему надо передать параметр при создании, что уже выглядит, как 
Код
(10)
, а как количество элементов этот параметр будет интерпретирован только конструктором MyClass, но ни как не компилятором. Если тип - уже массив, то 
Код
[10]
 означает массив высшей размерности, а формально массив массивов. А где для каждого из массивов-элементов взять параметр?

Это сообщение отредактировал(а) ТарасАтавин - 6.9.2013, 07:19


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

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

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

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

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


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

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


 




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


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

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