Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
stawerfar
143 / 57 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
#1

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

02.01.2011, 21:41. Просмотров 1361. Ответов 19
Метки нет (Все метки)

Здравствуйте уважаемые форумчане! Прошу Вас помочь мне уяснить работу конструкторов в классах! А точнее что нужно сделать что бы конструктор позволял программисту определить реальный размер двумерного массива (допустим изначально он был 10х10) сделать его меньше!
Если это поможет то я занимаюсь по Лафоре это 10 упражнение седьмой главы стр310!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2011, 21:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Конструкторы в классах (C++):

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них....

Конструкторы C++
Объясните, пожалуйста, своими словами, что являют собой конструкторы, для чего...

Конструкторы
Почему, если класс имеет конструктор с параметрами у него обязательно должен...

Конструкторы
Есть фрагмент кода: #include <iostream> using namespace std; class Counter...

Конструкторы С++
Здравствуйте. Помогите вместо функций void get и void set написать конструктор...

конструкторы
Есть 2 проблемы: 1) Сказали сделать 2 конструктора: один по умолчанию, а...

19
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
02.01.2011, 21:50 #2
Не совсем понятно, чего вы хотите добиться. Конструктор нужен не для того, чтобы что-то определить или что-то изменить, а чтобы инициализировать данные начальными значениями.
0
XomyaC++
7 / 7 / 1
Регистрация: 25.12.2010
Сообщений: 41
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];
};
0
stawerfar
143 / 57 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 21:57  [ТС] #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не совсем понятно, чего вы хотите добиться. Конструктор нужен не для того, чтобы что-то определить или что-то изменить, а чтобы инициализировать данные начальными значениями.
Дело в том что такова задача у Лафоре!Я изучил седьмую главу и после задания так вот это одно из заданий мне и самому не ясно как это вообще будет работать
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
02.01.2011, 22:09 #5
Вы можете написать задание? Мне лично лень скачивать книжку ради одного задания
0
stawerfar
143 / 57 / 8
Регистрация: 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)
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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, остальную часть вы трогать не убдете.
1
stawerfar
143 / 57 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:25  [ТС] #8
Большое спасибо попробую с этим разобраться ! Вот толь ко не понятно почему имена начинаются со знака _ ??
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
02.01.2011, 22:28 #9
Да потому что мне так захотелось))) Один из вариантов стиля программирования.
0
stawerfar
143 / 57 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:32  [ТС] #10
дело в том что Лафоре объясняет что _name большинство таких имен зарезервировано компилятором и не мудрено получить ошибку!Так как имя будет занято! НО в целом понятно!
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
02.01.2011, 22:35 #11
Да, я об этом знаю. И, тем не менее, продолжаю использовать такой стиль. Пока проблем не было.
0
stawerfar
143 / 57 / 8
Регистрация: 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)
{ };-это конструктор ? тогда почему стоят ; здесь?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
0
st_dent
64 / 64 / 12
Регистрация: 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;
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
02.01.2011, 22:56 #15
stawerfar, Что-то рано в классы полезли, раз тернарный оператор не знаете. Он ведь наравне с if/else изучается по книгам.
0
stawerfar
143 / 57 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
02.01.2011, 22:58  [ТС] #16
Понятно спасибо что так расписали суть полностью ясна!Простите за мою назойливость)) Осталось только одно как будит выглядеть в функции main использование этого конструктора
например :?
matrix x[2][3] // как то так ?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
02.01.2011, 23:00 #17
Да, согласен с ForEveR, вы слишком рано в классы полезли, раз не знаете, как создавать объект класса, используя конструктор с параметрами... Читайте книжки, без теории практика не будет и каплю продуктивной...

C++
1
Matrix matr(2, 3);
0
stawerfar
143 / 57 / 8
Регистрация: 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 минут
Прошу прощения за не удобность написания !Может кто подскажет как вставлять код в чат в нормальном привычном виде?
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
03.01.2011, 01:27 #19
А что вы хотели сделать с "размерностью самого массива"? Она задана при компиляции, при компиляции же чётко сказано, сколько программа должна выделить памяти в стеке под данную матрицу. Это теперь вшито в программу, и никак этого не изменить. Идея здесь в том, чтобы заранее создать массив заведомо большего размера, чем нам может понадобиться, а потом использовать только его часть. Т.е. массив так и останется 10 на 10, но использоваться будет только его кусок размером 2 на 3, например, а остальные ячейки будут забиты мусором (нас это не волнует, ведь мы их даже не используем).

Добавлено через 1 минуту
В верху окна сообщения, во втором ряду кнопок, 5 и 6 кнопки с надписями "С" и "С++" - теги форматирования кода. Их используйте.
0
stawerfar
143 / 57 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
03.01.2011, 01:30  [ТС] #20
Спасибо я так и подумал что само условие задачи немного абстрактно не совсем было понятно что от меня хотят!!Возможно оно таким стало в следствии перевода на Русский язык.
0
03.01.2011, 01:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2011, 01:30
Привет! Вот еще темы с решениями:

Конструкторы
У меня есть два конструктора: первый по умолчанию Circle() //Конструктор по...

конструкторы
Доброе время суток! Помогите разобраться с конструктором. Что это такое и с...

Конструкторы
#include&lt;iostream&gt; class A { public: A(int x) : _x(x) {} ...

Конструкторы С++
Всем привет, помогите довести программу до ума :) Заранее благодарю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru