Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
1

Инициализация объекта нулями или мусором

19.08.2015, 16:46. Показов 1480. Ответов 9
Метки нет (Все метки)

Здравствуйте. Я бы воспользовался поиском, но даже не знаю, как ему сформулировать вопрос.

Допустим, есть какой-то класс с конструктором:

C++
1
2
3
4
5
6
class SomeClass
{
public:
    //SomeClass();  //Такого нету
    SomeClass(int v1, int v2, int v3);
};
Создать объект такого класса без передачи ему трех значений нельзя:
SomeClass sc; //Так нельзя. No matching function to call to 'SomeClass::SomeClass()'
SomeClass a[128]; //Так, разумеется, тоже нельзя.

Но если очень нужно, то ведь все-таки как-то можно, да?
Как бы так создать объект данного класса, ничего ему не передавая? Меня вполне устроит, если конструктор не вызовется вообще, а вся память под объектом будет забита мусором или нулями.
Указатели в данном случае - не то...

Пока что придумал вот такой вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T>
class Holder
{
public:
 
    void set(const T &t)
    {
        memcpy(data, &t, sizeof(T));
    }
 
    T &get()
    {
        return (T &)data;
    }
 
private:
    char data[sizeof(T)];
};
Сейчас чешу репу и тестирую. Может, кто-то знает вариант попроще? Или объяснит, почему так делать ВООБЩЕ НЕЛЬЗЯ.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2015, 16:46
Ответы с готовыми решениями:

Матрица заполняется мусором, а нужно нулями. (с++)
Пока наброски, даже без отчистки памяти, но уже на этом этапе не работает не правильно . В итоге...

Инициализация глобального вектора мусором или создание общих данных
Нужно создать вектор, который бы было видно из любого обработчика. Создаю вектор в глобальной...

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

Половина матрицы заполняется нулями, другая мусором
int EnterArray25(int A, int n,int m) { int i, j; for (i = 0; i &lt; n; i++) { for (j = 0; j...

9
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
19.08.2015, 16:53 2
Цитата Сообщение от sion5 Посмотреть сообщение
Как бы так создать объект данного класса, ничего ему не передавая? Меня вполне устроит, если конструктор не вызовется вообще, а вся память под объектом будет забита мусором или нулями.
Указатели в данном случае - не то...
одно противоречит другому
0
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
19.08.2015, 17:07  [ТС] 3
Может, еще как-то так...
SomeClass some(*(SomeClass *)0);

Добавлено через 3 минуты
Не, так не надо :-D
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
19.08.2015, 17:08 4
Цитата Сообщение от sion5 Посмотреть сообщение
Или объяснит, почему так делать ВООБЩЕ НЕЛЬЗЯ.
Потому что это подразумевается программистом, когда он не добавляет в класс конструктора по умолчанию. Вообще, чем вас не устраивает SomeClass(){}?
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
19.08.2015, 17:08 5
Цитата Сообщение от sion5 Посмотреть сообщение
Может, еще как-то так...
Нет.
Лучше верни конструктор по-умолчанию и не извращайся над ООП.
0
860 / 784 / 266
Регистрация: 27.07.2012
Сообщений: 2,207
19.08.2015, 17:13 6
Цитата Сообщение от sion5 Посмотреть сообщение
SomeClass a[128]; //Так, разумеется, тоже нельзя.
Ну если нужен именно массив таких объектов, то можно через размещающий new их создать.
0
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
19.08.2015, 17:50  [ТС] 7
Я делаю простую имплементацию list с фиксированным максимальным размером...
В момент создания этого списка должна сразу выделиться вся память для его хранения. Причем, ровно столько, сколько нужно...
Исли я создаю
MyList<int, 100> list;
то занимать этот лист должен 404 байта. 400 на хранения записей и еще 4 на хранение переменной n - количества валидных записей в списке.

А если сделать с указателями... То одни только указатели займут 400 байт.. И значения - не меньше 400.
0
Эксперт С++
8430 / 4102 / 895
Регистрация: 15.11.2014
Сообщений: 9,216
19.08.2015, 19:14 8
Цитата Сообщение от sion5 Посмотреть сообщение
Меня вполне устроит, если конструктор не вызовется вообще, а вся память под объектом будет забита мусором или нулями.
C++
1
SomeClass(int v1 = 0, int v2 = 0, int v3 = 0);
0
15124 / 8122 / 1961
Регистрация: 30.01.2014
Сообщений: 13,808
19.08.2015, 19:20 9
sion5, размещающий new тебе поможет.
И главное помни - выделение памяти и создание объекта - это не одно и то же.
В твоем контейнере операцию нужно разбить на два этапа: сперва выделение всего куска памяти. А затем инициализация объектов в ней по мере добавления (и увеличение n).
Посмотри вот здесь: http://en.cppreference.com/w/c... ed_storage
Там как раз дан пример вектора, который работает по схожему принципу. Размещающий new используется в функции emplace_back.
0
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 42
19.08.2015, 19:59  [ТС] 10
DrOffset, действительно, спасибо... John Prick уже написал про размещающий new, но я о нем раньше не слышал и подумал, что он предлагает обычный массив указателей. А это, оказывается, разные вещи.
Сейчас буду разбираться подробнее...


Пока что (в последней версии) у меня вот так было:
Код
template <typename T, int SIZE>
class GList
{
public:
    GList() : n(0) {}

    bool append(const T &t)
    {
        if (n >= SIZE){return false;}

        T *slot = reinterpret_cast<T *>(items[n]);
        *slot = t;
        n += 1;

        return true;
    }

    T &operator[](int i)
    {
        T *slot = reinterpret_cast<T *>(items[i]);
        return *slot;
    }

    int size() { return n;}

private:
    char items[SIZE][sizeof(T)];
    int n;
};
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2015, 19:59

Инициализация массива строк нулями
Есть структура. Как проинициализировать значения полей '\0' ? struct Name { char firstName;...

Инициализация членов класса нулями
Необходимо инициализировать члены класса нулями. class ID { public: int GetKey() { return...

Инициализация массива нулями с помощью {}
зачем после размера массива указываются скобки int mas = {}?

Что такое инициализация сегментов или инициализация регистров?
Подскажите, что такое инициализация сегментов или инициализация регистров? Вот строчка программы из...


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

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

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