Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335

Ругается new при создании динамического массива через перегруженный конструктор

09.05.2013, 13:55. Показов 1619. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перегрузил конструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Library
{
public:
    Library(void)                       //конструктор библиотеки без заданного типа
    {
        TypeLibrary = 0;
    }
    Library(int type)                       //конструктор библиотеки опред. типа
    {
        TypeLibrary = type;
    }
private:
    int     TypeLibrary;                    //тип билиотеки
};
Вызывается new таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Library* addLibrary(int destr_flag, int size)
{
    Library *tmpMass;
    switch(destr_flag)
    {
    case 1:
        tmpMass = new Library (1) [size];
        break;
    case 2:
        tmpMass = new Library (2) [size];
        break;
    default:
        tmpMass = new Library [size];
        break;
    }
    return tmpMass;
}
На строках tmpMass = new Library (2) [size]; tmpMass = new Library (1) [size]; идёт ругань: не существует подходящей функции для преобразования из Library в Library *. Мне кажется что нужно переопределить оператор (=), верно? Потому как почему-то при создании массива через перегруженный конструктор указатель на память не возвращается..
соответственно в мэйне выглядит так:
C++
1
massLib = addLibrary(getFlag(),getAddNum());
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2013, 13:55
Ответы с готовыми решениями:

Передача параметров в конструктор при создании динамического массива
Добрый день! Есть довольно тривиальный класс: class Array1d{ int* ptr_; public: Array1d(int n): ptr_(new...

Почему при создании динамического массива через new ячейки массива имеют значение -842150451?
Я хотел бы узнать почему при создании динамического массива через операцию new ячейки массива имеют значение -842150451. #include...

Конструктор при создании через []
Как написать конструктор для класса при создании таким видом: class Array { private: int size; int* arr; public: .... ...

14
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 14:15
new Library[size](1)
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 14:39  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
new Library[size](1)
Не возможно указать новый инициализатор для массива
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 15:23
1. Оказывается так нельзя)
2. Зачем вам массив библиотек?
3. Ваша функция может выглядеть так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Library 
{
*******
static Library* create(int size, int flag) //Заметьте СОЗДАТЬ а не добавить так как вы создаете а не добавляете
{
    Library* ret = new Library[size]();
    for (int i = 0; i < size; ++i)
        ret[i]->TypeLibrary = flag;
 
   return ret;
}
*********
};
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 15:46  [ТС]
1 - да, нельзя)
2 - Постараюсь объяснить.
Вообще тз звучит так: есть два объекта книга и библиотека. У каждого объекта(по сути классы, далее класс) должно быть:
  • 4 поля
  • 1 перегруженный конструктор у каждого класса
  • 4 метода
На основе этих двух классов создать контейнерный класс.
В моём понимании это массив таких структур:
C++
1
2
3
4
5
struct container
{
    Library* lib;
    Book* bk;
};
Почему массив а не список? Цтирую:
Кликните здесь для просмотра всего текста
В каждом задании ДЗ требуется создать минимум один контейнерный класс. Контейнерные классы – это такие классы, на основе которых создаются объекты, вклю-чающие в себя другие объекты (отношение накопления). Контейнерные классы могут быть упорядоченными (массивы и списки) и неупорядоченными (множества). Для реали-зации контейнерных классов студенты могут выбрать один из подходов:
• Использование стандартных (библиотечных) классов типа список или массив, а соб-ственный контейнерный класс наследовать от них.
• Создание собственных списков в контейнерном классе задания (например, в классе улиц) и реализация в них всех операций над списками. Менее универсальный вари-ант.
• Создание собственных отдельных классов типа список и массив, с дальнейшим наследованием контейнерных классов задания от них. Более универсальный вариант.

Согласно моему варианту это должен быть массив а не список.
Причём интересно заметить, что: либо я идиот, либо заказчик идиот. Потому как "класс типа массив" это слон-рыба (для меня)

По сему не осознавая сути я бросился писать код. В моём понимании задача встала так:
- создаю массив структур container (где структура есть два указателя на элементы массива: т е структура это: указатель на элемент из массива книг и элемент из массива бибилиотек). Своего рода мы сопоставляем кадой книге свою библиотеку.
- как-то придумываю функции типа: "удалить книги одного автора", "снести библиотеку", "добавить книги в бибилиотеку" и далее до "добавить книги определённого автора" и "добавить библиотеки определённого типа". На этом месте я и решаю перегрузить конструкторы в обоих классах (пример перегрузки в первом посте).

В итоге я запутался.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.05.2013, 15:47
При создании массива используется конструктор без параметров. Хотите создавать разные элементы, создайте несколько разных классов. Или придется хранить состояние внутри конструктора. Например первые N элементов создаются с аргументом 1, потом с аргументом 2 и т.д. Но ничего хорошего в таком подходе нет.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 16:06  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
При создании массива используется конструктор без параметров.
И выходит ни как иначе вызвать другой (перегруженный конструктор) создании массива нельзя? Чтобы он чисто через него работал, а не через стандартный.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 16:07
2Gudsaf Вы не правильно поняли ТЗ.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//pseudo code
class Book ///<-- Это элементы контейнера.
{
public:
      Book(name, author);
 
private:
     name, author;
};
 
class Library  //<--Это контейнер
{
public:
    Library() {}
 
   add_book(Book*);
   remove_book(Book*);
 
private:
    Book *books; //или std::vector<Book*> books
};
п.с.
• Использование стандартных (библиотечных) классов типа список или массив, а соб-ственный контейнерный класс наследовать от них.

Скажите Вашему преподу, что у стандартных контейнеров нету виртуальных деструкторов. То что он написал это грубая ошибка. Можно только агрегацию. Т.е. будет обертка над std::vector или простым массивом.
1
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 16:15  [ТС]
Вот! Вот оно что мне надо было! Ладно, пойду писать с нуля) Спасибо что показали суть. Теперь понятно, что контейнер для книги (т е класс библиотека) должен содержать в себе указатель на книгу (у меня это массив книг целый).
Тогда выходит будет примерно так: есть массив библиотек (пусть три библиотеки разных типов) каждая библиотека содержит в себе массив книг(указатель на массив). Где книги будут разных типов и разных авторов.

Верно?
0
 Аватар для behemoth
44 / 30 / 18
Регистрация: 29.09.2012
Сообщений: 75
Записей в блоге: 1
09.05.2013, 16:17
как-то так шоле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Libary** addLibary(int cas, int size){
    Libary* (*p) = new Libary*[size];
    if(cas>2){
        for(int i=0;i<size;i++)
            p[i]=new Libary();
        return p;
    }
    for(int i=0;i<size;i++){
            p[i] = new Libary(cas);
    }
    return p;
}
мейн:
C++
1
2
Libary* (*lib);
lib = addLibary(getFlag(),getAddNum());
1
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 16:21  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
п.с.
• Использование стандартных (библиотечных) классов типа список или массив, а соб-ственный контейнерный класс наследовать от них.

Скажите Вашему преподу, что у стандартных контейнеров нету виртуальных деструкторов. То что он написал это грубая ошибка. Можно только агрегацию. Т.е. будет обертка над std::vector или простым массивом.
хех)) да думаю он вас не поймёт))
Ещё вопрос вы параллельно написали:
Цитата Сообщение от stima Посмотреть сообщение
Book *books; //или std::vector<Book*> books
std::vector<Book*> books - где про это почитать, или если можно, то в двух словах.

Добавлено через 2 минуты
Цитата Сообщение от behemoth Посмотреть сообщение
как-то так шоле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Libary** addLibary(int cas, int size){
    Libary* (*p) = new Libary*[size];
    if(cas>2){
        for(int i=0;i<size;i++)
            p[i]=new Libary();
        return p;
    }
    for(int i=0;i<size;i++){
            p[i] = new Libary(cas);
    }
    return p;
}
мейн:
C++
1
2
Libary* (*lib);
lib = addLibary(getFlag(),getAddNum());
Тоже хорошее решение!
Правда тогда я не понимал сути контейнера, и тогда это было верно. Видите ли в вашем коде (как я и хотел по началу) будут создаваться разные массивы - для каждого типа книги свой массив: я эту проблему осознал совсем недавно когда ещё раз себя анализировал. Для контейнера этот подход не верен)
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 16:28
Цитата Сообщение от Gudsaf Посмотреть сообщение
библиотеки разных типов
Вы видели такое в жизни? Формулируйте правильно вопрос.

1. Можно расширить добавив жанры для книг. Но, как и в жизни, когда вы приходите в библиотеку (ваш контейнер) там есть любые жанры. Так что это просто enum в классе Book.
C++
1
2
3
4
5
6
7
8
class Book
{
   public:
        enum Genres { Adventure, Comic, /* и тд*/};
   
    private:
        Genres genre;
};
2. Можно сказать что у нас есть бумага на которой можно писать и с которой можно читать. А из бумаги сделаны журналы, книги и т.д
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class IPaper
{
    public:
         virtual void write() = 0;
         virtual void read()  = 0;
};
 
class Book : public IPaper
{
 public:
      void read()
     {
    std::cout << "Book " << std::endl;
    }
};
 
 
class Magazine : public IPaper
{
 public:
      void read()
     {
    std::cout << "Magazie" << std::endl;
    }
****
};
 
//и например библиотека хранящая все бумажные изделия:
class Library 
{
public:
      add(IPaper*);
private:
     std::vector<IPaper*> papers;
};
Добавлено через 3 минуты
Цитата Сообщение от Gudsaf Посмотреть сообщение
хех)) да думаю он вас не поймёт))
Если не совсем дурак, то поймет.


Цитата Сообщение от Gudsaf Посмотреть сообщение
std::vector<Book*> books - где про это почитать, или если можно, то в двух словах.
Google
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 17:09  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
Вы видели такое в жизни? Формулируйте правильно вопрос.
государственная/негосударственная
русская/белорусская

А жанр уже был добавлен
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
09.05.2013, 17:14
Цитата Сообщение от Gudsaf Посмотреть сообщение
государственная/негосударственная
русская/белорусская
Это как-то относиться к книгам? Нет - это просто 2 enum'a в классе Library.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.05.2013, 18:38  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
Это как-то относиться к книгам? Нет - это просто 2 enum'a в классе Library.
Не суть уже: я обманул систему)))
Получил что хотел массив типа библиотека с разными библиотеками, где при создании каждого элемента вызывается свой конструктор
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Library* addLibrary(int size)
{
    int i = 0;
    int flag;
    Library *arr;
    arr =(Library*) malloc(size*sizeof(Library));
    while (size)
    {
        flag = getFlag();
        if (flag == 0)
        {
            Library tmp;
            arr[i++] = tmp;
        }
        else if (flag == 1)
        {
            Library tmp(1);
            arr[i++] = tmp;
        }
        else if (flag == 2)
        {
            Library tmp(2, val_2);
            arr[i++] = tmp;
        }
        size--;
    }
    return arr;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2013, 18:38
Помогаю со студенческими работами здесь

Ошибка при создании динамического массива.
Все доброго времени. Начал создавать одномерный массив, потом решил его преобразовать в динамический одномерный. Понимаю что...

Ошибка при создании динамического двумерного массива
Ткните пальцем, что не так. Только учусь, делаю лабы, камнями не забрасывайте. Смотрел шаблоны здесь и в других местах, но есть вопрос. ...

String subscript out of range при создании динамического массива
Всем привет. Пишу игру на c++. Смысл состоит в том чтобы отстреливать группы врагов, которые появляются сразу после уничтожения предыдущей...

Выводит ошибку при создании динамического массива стрктур
#include &quot;pch.h&quot; #include &lt;iostream&gt; using namespace std; struct psh { string abc; double l; }; int main(){ ...

Почему при создании динамического массива, отладчик видит только один первый элемент?
Здравствуйте. Объясните почему при создании динамического массива, отладчик (а точнее окно &quot;контрольные значения&quot;) видит только...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru