Передача массива в конструктор производного класса
Народ, задача такая:
Создать абстрактный класс с виртуальной функцией – норма.
Создать производные классы : комплексные числа, вектор из 10 элементов,
матрица 2х2. Определить функцию нормы : для комплексных чисел – модуль, для вектора – корень квадратный из суммы элементов по модулю,для матрицы – максимальное значение по модулю.
С комплексными числами вроде как разобрался (не знаю на сколько правильно, но вроде работает), а вот с массивами застрял конкретно. Подскажите как нужно работать с массивами?
Конструктор производного класса требует конструктор предка
Выдаёт вот такую вот ошибку: no matching function for call to ‘Cube::Cube()’ class Cube <.
Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний.
Конструктор производного класса
Доброго времени суток!! Значит так, есть у меня две строки большая и маленькая и два класс String и.
Наследование. Конструктор базового класса в теле производного
Здравствуйте! Помогите, пожалуйста, разобраться. Есть пример: class String < protected.
Как передать массив в конструктор?
Добрый вечер, это не то, о чем вы подумали! О new[] я знаю =)
Я делаю свою простую реализацию умных указателей для с++98. Но не могу сделать сделать указатель на массив.
Когда добавляю конструктор smart_ptr(int[] t) <>;
подчёркивает t и пишет что не хватает ‘)’ . Да, все кавычки и скобки до и после этого конструктора стоят нормально.
Как это исправить? И разве массив это не указатель(ну не сам массив, ну вы поняли =))?
- Вопрос задан более года назад
- 174 просмотра
Простой 3 комментария
- Вконтакте
Sergio Поменял, но не дает все равно сохранить указатель на массив. Конструктор вот такой
что-то не понимаю, почему мне дают сохранить указатель на первый элемент массива.
У тебя _ptr не правильно обьявлён, скинь как ты его обьявляешь.
Лучше использовать указатели так int *t, а не так int t[]. И вот это _ptr = &(t[0]); аналогично этому _ptr = t. Судя по коду и твоей задаче тебе нужно сохранить указатель на зарезервированную облать и по итогу у тебя должно получиться нечто такое:
И так как это у тебя умный указатель тебе желательно делать так int *_ptr=nullptr и в конструкторе проверять этот момент и вести подсчёт указателей на эту область памяти чтобы при удалении и создании небыло утечки памяти, так же ещё есть конструкторы копирования, перемещения и их тоже надо переопределять, но так как у тебя простой умный указатель лучше определи их как = delete, чтобы потом не появлялись вопросы от куда взялась лишняя ссылка.
Как передать массив в конструктор c
У меня есть класс, который обозначает некий прогноз.
Создавая его объект, передаю значение double. Вопрос – как передать туда массив?
То есть – как правильно синтаксически – передать заполненный массив в класс. Как передать массив в виде аргумента конструктора? Нужно ли этот массив создавать в конструкторе класса именно в жтой ситуации? Что вообще надо сделать в конструкторе при наличии массива среди переменных класса?
Возможно вопром мтоит гнилых помидоров, но прошу ими не кидать в меня — просто мне нужен пример ПРАВИЛЬНОГО кода!вопрос чести
| От: | Аноним |
| Дата: | 29.08.03 13:38 |
| Оценка: |
Здравствуйте, altmenn, Вы писали:
A> Создавая его объект, передаю значение double. Вопрос – как передать туда массив?
Никак.
A>Возможно вопром мтоит гнилых помидоров, но прошу ими не кидать в меня — просто мне нужен пример ПРАВИЛЬНОГО кода!
| От: | Sergey |
| Дата: | 29.08.03 13:59 |
| Оценка: |
Hello, altmenn!
You wrote on Fri, 29 Aug 2003 13:19:10 GMT:
a> У меня есть класс, который обозначает некий прогноз.
a>
a> Создавая его объект, передаю значение double. Вопрос – как передать
a> туда массив?
Массив — никак. Можно передать ссылку на массив или указатель на первый элемент.
a> То есть – как правильно синтаксически – передать
a> заполненный массив в класс. Как передать массив в виде аргумента
a> конструктора?
a> Нужно ли этот массив создавать в конструкторе класса
a> именно в жтой ситуации?
Он сам создастся. Нужно ли тебе его инициалировать — тебе виднее.
a> Что вообще надо сделать в конструкторе при
a> наличии массива среди переменных класса?
Зависит от того, что тебе надо.
Best regards,
Sergey.
| От: | altmenn | DLR IPA |
| Дата: | 29.08.03 14:04 | |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, altmenn, Вы писали:
A>> Создавая его объект, передаю значение double. Вопрос – как передать туда массив?
А>Никак.
A>>Возможно вопром мтоит гнилых помидоров, но прошу ими не кидать в меня — просто мне нужен пример ПРАВИЛЬНОГО кода!
А>
Спасибо! А то, что Вы знаете stl мне очень помогло
| От: | altmenn | DLR IPA |
| Дата: | 29.08.03 14:08 | |
| Оценка: |
Вопрос еще. Вы отвечаете:
a>> Нужно ли этот массив создавать в конструкторе класса
a>> именно в этой ситуации?
S>Он сам создастся. Нужно ли тебе его инициалировать — тебе виднее.
В принципе мне и надо выяснить — в каком случае необходима инициализация. Если класс принимает при использовании заполненный массив, то его не надо ни создавать ни инициализировать — правильно я поняла?
| От: | Sergey |
| Дата: | 29.08.03 14:12 |
| Оценка: |
Hello, altmenn!
You wrote on Fri, 29 Aug 2003 14:08:45 GMT:
a> Вопрос еще. Вы отвечаете:
a>>> Нужно ли этот массив создавать в конструкторе класса
a>>> именно в этой ситуации?
S>> Он сам создастся. Нужно ли тебе его инициалировать — тебе виднее.
a> В принципе мне и надо выяснить — в каком случае необходима
a> инициализация. Если класс принимает при использовании заполненный
a> массив, то его не надо ни создавать ни инициализировать — правильно я
a> поняла?
Если тебе нужен заполненный массив, придется его заполнять самостоятельно. Синтаксиса для присваивания массивов, насколько мне известно, не существует.
Best regards,
Sergey.
| От: | Анатолий Широков |
| Дата: | 29.08.03 14:31 |
| Оценка: |
Можно без копирования — передать и сразу же обработать:
| От: | LaptevVV |
| Дата: | 29.08.03 14:36 |
| Оценка: |
Здравствуйте, altmenn, Вы писали:
A>У меня есть класс, который обозначает некий прогноз.
A>
A> Создавая его объект, передаю значение double. Вопрос – как передать туда массив?
A>То есть – как правильно синтаксически – передать заполненный массив в класс. Как передать массив в виде аргумента конструктора? Нужно ли этот массив создавать в конструкторе класса именно в жтой ситуации? Что вообще надо сделать в конструкторе при наличии массива среди переменных класса?
В тот класс, который написан — никак. Вы можете определить класс прямо с массивом в качестве члена — тогда надо длину проставлять. У Вас в этом случае должен быть конструктор, с аргументом-указателем (имя массива — указатель) и длиной массива.
Далее, вы можете в программе создавать любым способом массив того типа, что у Вас в в классе в качестве поля, заполнять его и вызывать конструктор, прописывая в аргументах этот заполненный массив.
Вариант с длиной массива — указать ее как параметр шаблона. Тогда ваш класс с массивом — шаблон.
Второй путь — прописать в классе указатель. Тогда в конструкторе надо будет выделять память. Сколько — может быть параметром конструктора. Заполнять такой объект придется отдельно.
Можно перегрузить конструктор и параметрами опять прописать указатель и длину. Тогда конструктор выделяет память по аргументу-длине и заполняет из передаваемого массива.
| От: | Аноним |
| Дата: | 29.08.03 14:41 |
| Оценка: |
Здравствуйте, altmenn, Вы писали:
A>Спасибо! А то, что Вы знаете stl мне очень помогло
Нет, ну если уж Вы так не любите STL, можно обойтись, конечно.
| От: | LaptevVV |
| Дата: | 29.08.03 14:47 |
| Оценка: |
| От: | Анатолий Широков |
| Дата: | 29.08.03 14:56 |
| Оценка: |
Здравствуйте, LaptevVV, Вы писали:
LVV>Анатолий Широков уже прописал вариант.
LVV>Но я еще подскажу.
LVV>Если количество данных невелико, то можно определить конструктор с переменным числом параметров. Тогда конструктор считает параметры и резервирует столько памяти, сколько параметров.
LVV>Естественно, не забудьте, что деструктор должен всю затребованную память возвращать.
Я не стал бы ради передачи массива переменной длины корячиться с эллипсом (. ) — это слишком.
| От: | skyline |
| Дата: | 01.09.03 06:48 |
| Оценка: |
Здравствуйте, Sergey
S>Синтаксиса для присваивания массивов, насколько мне известно, не существует.
Если заменить твой массив на boost::array, то будет синтаксис присваивания.
Как передать массив в конструктор в C ++?
Я пытаюсь передать массив конструктору в C ++, но он не работает:
Решение
Ваш пример работает нормально — просто позаботьтесь о delete[] с new[] выделил место соответственно после того, как вы закончили (чтобы предотвратить утечку памяти). Также вместо использования 15 в качестве жестко закодированной константы, вы, вероятно, захотите использовать параметр size (иначе для массивов больше чем 15 элементов, у вас будет нарушение доступа к памяти).
Массивы могут быть размещены в C ++ по-разному:
По сути, он решает, в какой памяти будет расположен ваш массив — но есть много различий в этих двух задействованных методах — см. Т.е. Что и где находится стек и куча? .
Некоторые основные отличия:
- выделение стека не может использовать динамическую длину как переменную, т.е. int size = 10; int a[size]; // <- is invalid
- выделение стека автоматически удаляется, когда они выходят за рамки
- выделение кучи должно быть deleted[] явный, чтобы не утечка памяти
Линия int* a = new int[3]; объявит указатель-переменную в ячейку памяти, где 3 int значения могут соответствовать. Таким образом, после объявления эти 3 значения могут быть адресованы непосредственно как a[0] , a[1] а также a[2] , После того, как все операции завершены delete[] a; является необходимым. Потому что, если указатель a* выходит из области видимости (то есть в конец вашей функции), память для 3 значений не освобождается автоматически.