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

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

Восстановить пароль Регистрация
 
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 13:55     Ругается new при создании динамического массива через перегруженный конструктор #1
Перегрузил конструктор:
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());
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 14:15     Ругается new при создании динамического массива через перегруженный конструктор #2
new Library[size](1)
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 14:39  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #3
Цитата Сообщение от stima Посмотреть сообщение
new Library[size](1)
Не возможно указать новый инициализатор для массива
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 15:23     Ругается new при создании динамического массива через перегруженный конструктор #4
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;
}
*********
};
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 15:46  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #5
1 - да, нельзя)
2 - Постараюсь объяснить.
Вообще тз звучит так: есть два объекта книга и библиотека. У каждого объекта(по сути классы, далее класс) должно быть:
  • 4 поля
  • 1 перегруженный конструктор у каждого класса
  • 4 метода
На основе этих двух классов создать контейнерный класс.
В моём понимании это массив таких структур:
C++
1
2
3
4
5
struct container
{
    Library* lib;
    Book* bk;
};
Почему массив а не список? Цтирую:
Кликните здесь для просмотра всего текста
В каждом задании ДЗ требуется создать минимум один контейнерный класс. Контейнерные классы – это такие классы, на основе которых создаются объекты, вклю-чающие в себя другие объекты (отношение накопления). Контейнерные классы могут быть упорядоченными (массивы и списки) и неупорядоченными (множества). Для реали-зации контейнерных классов студенты могут выбрать один из подходов:
• Использование стандартных (библиотечных) классов типа список или массив, а соб-ственный контейнерный класс наследовать от них.
• Создание собственных списков в контейнерном классе задания (например, в классе улиц) и реализация в них всех операций над списками. Менее универсальный вари-ант.
• Создание собственных отдельных классов типа список и массив, с дальнейшим наследованием контейнерных классов задания от них. Более универсальный вариант.

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

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

В итоге я запутался.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.05.2013, 15:47     Ругается new при создании динамического массива через перегруженный конструктор #6
При создании массива используется конструктор без параметров. Хотите создавать разные элементы, создайте несколько разных классов. Или придется хранить состояние внутри конструктора. Например первые N элементов создаются с аргументом 1, потом с аргументом 2 и т.д. Но ничего хорошего в таком подходе нет.
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 16:06  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #7
Цитата Сообщение от Tulosba Посмотреть сообщение
При создании массива используется конструктор без параметров.
И выходит ни как иначе вызвать другой (перегруженный конструктор) создании массива нельзя? Чтобы он чисто через него работал, а не через стандартный.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 16:07     Ругается new при создании динамического массива через перегруженный конструктор #8
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 или простым массивом.
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 16:15  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #9
Вот! Вот оно что мне надо было! Ладно, пойду писать с нуля) Спасибо что показали суть. Теперь понятно, что контейнер для книги (т е класс библиотека) должен содержать в себе указатель на книгу (у меня это массив книг целый).
Тогда выходит будет примерно так: есть массив библиотек (пусть три библиотеки разных типов) каждая библиотека содержит в себе массив книг(указатель на массив). Где книги будут разных типов и разных авторов.

Верно?
behemoth
 Аватар для behemoth
44 / 30 / 7
Регистрация: 29.09.2012
Сообщений: 75
Записей в блоге: 1
09.05.2013, 16:17     Ругается new при создании динамического массива через перегруженный конструктор #10
как-то так шоле:
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());
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 16:21  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #11
Цитата Сообщение от 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());
Тоже хорошее решение!
Правда тогда я не понимал сути контейнера, и тогда это было верно. Видите ли в вашем коде (как я и хотел по началу) будут создаваться разные массивы - для каждого типа книги свой массив: я эту проблему осознал совсем недавно когда ещё раз себя анализировал. Для контейнера этот подход не верен)
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 16:28     Ругается new при создании динамического массива через перегруженный конструктор #12
Цитата Сообщение от 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
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 17:09  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #13
Цитата Сообщение от stima Посмотреть сообщение
Вы видели такое в жизни? Формулируйте правильно вопрос.
государственная/негосударственная
русская/белорусская

А жанр уже был добавлен
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 17:14     Ругается new при создании динамического массива через перегруженный конструктор #14
Цитата Сообщение от Gudsaf Посмотреть сообщение
государственная/негосударственная
русская/белорусская
Это как-то относиться к книгам? Нет - это просто 2 enum'a в классе Library.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 18:38     Ругается new при создании динамического массива через перегруженный конструктор
Еще ссылки по теме:

C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
String subscript out of range при создании динамического массива C++
Конструктор при создании через [] C++

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

Или воспользуйтесь поиском по форуму:
Gudsaf
103 / 14 / 3
Регистрация: 29.11.2010
Сообщений: 325
09.05.2013, 18:38  [ТС]     Ругается new при создании динамического массива через перегруженный конструктор #15
Цитата Сообщение от 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;
}
Yandex
Объявления
09.05.2013, 18:38     Ругается new при создании динамического массива через перегруженный конструктор
Ответ Создать тему
Опции темы

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