Форум программистов, компьютерный форум CyberForum.ru

Конструкторы в классах - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 21:41     Конструкторы в классах #1
Здравствуйте уважаемые форумчане! Прошу Вас помочь мне уяснить работу конструкторов в классах! А точнее что нужно сделать что бы конструктор позволял программисту определить реальный размер двумерного массива (допустим изначально он был 10х10) сделать его меньше!
Если это поможет то я занимаюсь по Лафоре это 10 упражнение седьмой главы стр310!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 21:50     Конструкторы в классах #2
Не совсем понятно, чего вы хотите добиться. Конструктор нужен не для того, чтобы что-то определить или что-то изменить, а чтобы инициализировать данные начальными значениями.
XomyaC++
7 / 7 / 1
Регистрация: 25.12.2010
Сообщений: 40
02.01.2011, 21:50     Конструкторы в классах #3
Цитата Сообщение от stawerfar Посмотреть сообщение
А точнее что нужно сделать что бы конструктор позволял программисту определить реальный размер двумерного массива (допустим изначально он был 10х10) сделать его меньше!
ClassA(int i, int j); // конструктор, где i и j размерности
Уже внутри конструктора выделяем память под массив [i][j] (конечно мы помним, что нельзя сделать так mas = new int[i][j]; )
Но если нужно иметь константные размеры массива, то лучше через шаблоны
C++
1
2
3
4
template<class Ni, class Nj>
ClassA {
int mas[Ni][Nj];
};
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 21:57  [ТС]     Конструкторы в классах #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не совсем понятно, чего вы хотите добиться. Конструктор нужен не для того, чтобы что-то определить или что-то изменить, а чтобы инициализировать данные начальными значениями.
Дело в том что такова задача у Лафоре!Я изучил седьмую главу и после задания так вот это одно из заданий мне и самому не ясно как это вообще будет работать
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 22:09     Конструкторы в классах #5
Вы можете написать задание? Мне лично лень скачивать книжку ради одного задания
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:15  [ТС]     Конструкторы в классах #6
Для ясности дела вот с такой задачей я столкнулся:
Матрица это двумерный массив. Создайте класс matrix , который предоставляет меры безопасности(переполнение, обращение к существующим полям),осуществляет проверку индексов массива на вхождение их в границы массива.Полем класса matrix будет массив 10 на 10. Конструктор должен позволять программисту определить реальный размер массива(допустим ,сделать его меньше, чем 10 на 10)

Добавлено через 2 минуты
silent_1991,
Для ясности дела вот с такой задачей я столкнулся:
Матрица это двумерный массив. Создайте класс matrix , который предоставляет меры безопасности(переполнение, обращение к существующим полям),осуществляет проверку индексов массива на вхождение их в границы массива.Полем класса matrix будет массив 10 на 10. Конструктор должен позволять программисту определить реальный размер массива(допустим ,сделать его меньше, чем 10 на 10)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 22:16     Конструкторы в классах #7
Ну а в чём проблема? Я бы, конечно, использовал динамику, но раз уж задание такое...
Примерно так будет выглядеть класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Matrix
{
private:
    int _matrix[10][10];
    int _rows;
    int _cols;
 
public:
    Matrix(int rows = 2, int cols = 2):
    _rows(rows <= 10 ? rows : 10),
    _cols(cols <= 10 ? cols : 10)
    { };
    // Остальные методы
};
Реально вы будете использовать только часть массива размером _rows x _cols, остальную часть вы трогать не убдете.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:25  [ТС]     Конструкторы в классах #8
Большое спасибо попробую с этим разобраться ! Вот толь ко не понятно почему имена начинаются со знака _ ??
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 22:28     Конструкторы в классах #9
Да потому что мне так захотелось))) Один из вариантов стиля программирования.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:32  [ТС]     Конструкторы в классах #10
дело в том что Лафоре объясняет что _name большинство таких имен зарезервировано компилятором и не мудрено получить ошибку!Так как имя будет занято! НО в целом понятно!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 22:35     Конструкторы в классах #11
Да, я об этом знаю. И, тем не менее, продолжаю использовать такой стиль. Пока проблем не было.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:44  [ТС]     Конструкторы в классах #12
Спасибо! Если честно Вы используете мне пока не известные операторы! Например "?".
Matrix(int rows = 2, int cols = 2):
_rows(rows <= 10 ? rows : 10),
_cols(cols <= 10 ? cols : 10)
{ };-это конструктор ? тогда почему стоят ; здесь?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 22:51     Конструкторы в классах #13
Вообще ?: - единственный тернарный оператор языка. Тернарный - значит, что он работает сразу с тремя операндами (для примера, операция сложения "+" - бинарный оператор, т.е. обрабатывается два оператора, а операция перемены знака "-" - унарный оператор (работает только с одним операндом)). Суть его следующая:

C++
1
result = bool_expr ? a : b;
Выполняется так: если условие bool_expr - истинно, то результатом всей операции станет a, в ином случае результатом будет b. В моём примере это используется так:

C++
1
rows <= 10 ? rows : 10
Если rows <= 10 (число строк меньше либо равно 10), то результатом операции станет rows (т.е. переменная _rows инициализируется значением rows <= 10), иначе результатом станет 10 (что логично, ведь массив-то у нас размером 10 х 10, а значит, если пользователь захочет создать матрицу 12 х 3 и мы не сделаем проверку на <= 10, то обязательно произойдёт выход за границы массива).

Чтобы было ещё понятнее, эквивалентом этой записи служит запись

C++
1
2
3
4
if (bool_expr)
    result = a;
else
    result = b;
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
02.01.2011, 22:53     Конструкторы в классах #14
Цитата Сообщение от stawerfar Посмотреть сообщение
Спасибо! Если честно Вы используете мне пока не известные операторы! Например "?".
Это тернарный оператор. Заменяет if/else
синтаксис:
условие?true-выражение:false-выражение
C++
1
2
3
4
if(а<b)max=b;
else max=a;
//тоже самое
max=(a<b)?b:a;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.01.2011, 22:56     Конструкторы в классах #15
stawerfar, Что-то рано в классы полезли, раз тернарный оператор не знаете. Он ведь наравне с if/else изучается по книгам.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:58  [ТС]     Конструкторы в классах #16
Понятно спасибо что так расписали суть полностью ясна!Простите за мою назойливость)) Осталось только одно как будит выглядеть в функции main использование этого конструктора
например :?
matrix x[2][3] // как то так ?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.01.2011, 23:00     Конструкторы в классах #17
Да, согласен с ForEveR, вы слишком рано в классы полезли, раз не знаете, как создавать объект класса, используя конструктор с параметрами... Читайте книжки, без теории практика не будет и каплю продуктивной...

C++
1
Matrix matr(2, 3);
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.01.2011, 01:26  [ТС]     Конструкторы в классах #18
я с Вами согласен я просто его забыл! Ведь у каждого формируется свой стиль написания кода ! А этот оператор не единственный которым можно решить эту проблему! Я просто его ни когда не использовал вот и забыл о его существовании!

Добавлено через 2 часа 13 минут
Сергей при всем уважении я разобрался в на писаном Вами коде и сожалению обнаружил что он не отвечает условиям задачи!Он обще не прикоснется к размерности двумерного массива а только конструктором дает возможность инициализировать две переменные _rows и _cols! Эти переменные ни как ни касаются размерности массива!Я попробовал и решил эту ситуацию вот так:
/пример задачи 10
#include<Rus.h>
//#include<iostream>
#include<cstring>
//using namespace std;
class Matrix
{
private:
int _matrix[10][10];
int _rows;
int _cols;

public:
Matrix(int rows , int cols ):_rows(rows <= 10 ? rows : 10),_cols(cols <= 10 ? cols : 10)
{ }
// осталтные методы
void enter(int index_main_mas,int index_over_mas,int number);//инициализация массива
void display(int index_main_mas,int index_over_mas)const;// вывод значения

};
void Matrix::enter(int one,int two,int num)
{ if(one<=_rows&&one>=0&&two<=_cols&&two>=0)
{
_matrix[one][two]=num;
}

}

void Matrix::display(int one,int two)const
{
if(one<=_rows&&one>=0&&two<=_cols&&two>=0)
{
cout<<"\tЗначение массива ["<<one<<"]["<<two<<"] = "<<_matrix[one][two]<<endl;
}
else // ругаемся что указный индекс не принадлежит массиву
{cout<<"\tУказанный Вами индекс "<<one<<" не принадлежит массиву размерностью ["<<_rows<<"]["<<_cols<<"]"<<endl;}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{ Matrix x (2,2) ;
x.enter(3,5,67);
x.display(3,5);






system("pause");
return 0;
}
может Вы мне хотели донести другую идею?

Добавлено через 11 минут
Прошу прощения за не удобность написания !Может кто подскажет как вставлять код в чат в нормальном привычном виде?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.01.2011, 01:27     Конструкторы в классах #19
А что вы хотели сделать с "размерностью самого массива"? Она задана при компиляции, при компиляции же чётко сказано, сколько программа должна выделить памяти в стеке под данную матрицу. Это теперь вшито в программу, и никак этого не изменить. Идея здесь в том, чтобы заранее создать массив заведомо большего размера, чем нам может понадобиться, а потом использовать только его часть. Т.е. массив так и останется 10 на 10, но использоваться будет только его кусок размером 2 на 3, например, а остальные ячейки будут забиты мусором (нас это не волнует, ведь мы их даже не используем).

Добавлено через 1 минуту
В верху окна сообщения, во втором ряду кнопок, 5 и 6 кнопки с надписями "С" и "С++" - теги форматирования кода. Их используйте.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2011, 01:30     Конструкторы в классах
Еще ссылки по теме:

C++ Конструкторы
C++ Конструкторы
C++ Конструкторы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.01.2011, 01:30  [ТС]     Конструкторы в классах #20
Спасибо я так и подумал что само условие задачи немного абстрактно не совсем было понятно что от меня хотят!!Возможно оно таким стало в следствии перевода на Русский язык.
Yandex
Объявления
03.01.2011, 01:30     Конструкторы в классах
Ответ Создать тему
Опции темы

Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru