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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2010, 19:54   #1
AJlekceu
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 16
Вопрос "Константный класс"

Здравствуйте, уважаемые форумчане!
Надеюсь, что вы поделитесь со мной своими мыслями по поводу следующей проблемы.
Имеется класс.
Код:
class AnyClass {
public:
    AnyClass();
    ~AnyClass();
    int** Array;
} ;

AnyClass::AnyClass() {
    Array = new int*[5];
    for(int i = 0; i < 5; i++) {
        Array[i] = new int[3];
    }
}

AnyClass::~AnyClass() {
    for(int i = 0; i < 5; i++) {
        delete [] Array[i];
    }
    delete [] Array;
}
Существует ли такая-эдакая хитрость в си++, позволяющая объявить константный экземпляр этого класса, при этом все элементы его массива Array были бы равны, например, нулям? Другими словами, как такой объект проинициализировать? Или лучше выкинуть из головы всё это, воспользовавшись неконстантым объявлением объекта, обнуление элементов массива которого произвести, допустим, в main?
AJlekceu вне форума Ответить с цитированием
Старый 20.11.2010, 20:01   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Это не "все это", а вполне законная часто используемая возможность языка С++ - константные объекты.
Много писать, почитайте тута http://*************/readarticle.php?article_id=2694.
В общем, в конструкторе разрешено инициализировать данные-члены класса при создании объекта.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 20.11.2010, 20:19   #3
AJlekceu
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 16
По умолчанию

Естественно, mutable можно использовать для таких целей. Но прошу прощения, забыл важную деталь: хотелось бы, чтобы этот объект был глобальным. И чтобы его можно было использовать исключительно в качестве Rvalue. Вообще я работаю над созданием класса - матрицы, и хотелось бы, в качестве константных, ввести на глобальном уровне нулевую и единичную матрицы.
AJlekceu вне форума Ответить с цитированием
Старый 20.11.2010, 20:33   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Вообще, я намекал на что-то типа:
Код:
class AnyClass {
public:
	enum matr_type {nul_matr=1, ed_matr};
	
	AnyClass();
	AnyClass(const matr_type &type);
    ~AnyClass();
    int** Array;
} ;

AnyClass::AnyClass() {
    Array = new int*[5];
    for(int i = 0; i < 5; i++) {
        Array[i] = new int[3];
    }
}

AnyClass::AnyClass(const matr_type &type) {
	if(type == nul_matr)
		; // Create the нулевую matrix
	else if(type == ed_matr)
		; // Create the единичную matrix
}

AnyClass::~AnyClass() {
    for(int i = 0; i < 5; i++) {
        delete [] Array[i];
    }
    delete [] Array;
}

const AnyClass ed_matrix(AnyClass::ed_matr); // Create the const единичную matrix
const AnyClass nul_matrix(AnyClass::nul_matr); // Create the const нулевую matrix
Или можно сделать много конструкторов, чтобы можно было создавать матрицу заданных размеров и т.д.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 20.11.2010 в 20:36.
Syuf вне форума Ответить с цитированием
Старый 20.11.2010, 21:12   #5
AJlekceu
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 16
По умолчанию

Спасибо, Syuf! И всё же до этого способа я не мог не додуматься, проблема даже была не совсем в этом Не нравится мне в C++ то, что не обеспечена в нём гибкая работа с инициализацией константных объектов (двоеточие перед "{" конструктора не позволяет реализовать всего), и надеялся на то, что я кое-чего просто не знаю об этом языке.
Рассмотренный случай не очень удачен, поэтому возьму другой: пусть в рамках некоторого класса объявляется константная матрица

const AnyClass Osoboya_Matrica

Она должна представлять собой такую таблицу 5х5, чтобы каждый её элемент [m][n] был равен m * 5 + n + 1, то есть, выглядеть так:
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
...
21, 22, 23, 24, 25
Эта матрица часто используется в расчётах, поэтому неплохо бы её сделать константной. В данном случае не целесообразно вставлять в enum класса AnyClass ещё один элемент - osob_matr - мало ли будет существовать классов, которым будут нужны константные экземпляры AnyClass? А если AnyClass и вовсе написан другим программистом и содержится в dll?
AJlekceu вне форума Ответить с цитированием
Старый 20.11.2010, 21:24   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Ну, тогда следует пошаманить с конструкторами:
Код:
class AnyClass
{
      // ...
      AnyClass(int _str, int _stlb, int (*lpfunct)(int str, int stlb));
Конструктор выделяет память и вызывает для каждого элемента функцию.
Где lpfunct указывает на функцию, принимающую столбец и строку и возвращающую элемент, который должен там находиться, т.е.:
Код:
int myfunct(int str, int stlb)
{
      return str*5 + stlb + 1;
}
Также не забывайте про константные функции-члены класса.
Они могут найти другое решение этой задачи.

Также моно загробастать конструктор с переменным кол-вом аргументов(если такие существуют), иницилизирующий соответственный элемент соответствующим значением.

В общем, много вариантов, и эта неудобность кажущаяся.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 20.11.2010 в 21:28.
Syuf вне форума Ответить с цитированием
Старый 20.11.2010, 21:43   #7
AJlekceu
Пользователь
 
Регистрация: 20.11.2010
Сообщений: 16
По умолчанию

Огромное спасибо! Весьма интересный способ, сам я не являюсь (лся) любителем использовать указатели на функции, теперь отчётливо вижу их полезность. Решение проблемы подходит для многих случаев, (для случая, когда dll уже имеется и подобного конструктора в классе не реализовано, т.е если программист, написавший dll, не знает о целях программиста, использующего эту dll, и они вообще не являются сотрудниками одной фирмы), тем не менее, он весьма универсален, хотя и имеет недостаток - множественный вызов функции, однако вряд ли здесь было можно придумать что-то лучшее
AJlekceu вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Класс "векторные операции" для трехмерных векторов. Студентка@ Помощь студентам 1 30.01.2008 19:21