Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602

Отключение конструктора у массива

10.05.2018, 06:46. Показов 2966. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть шаблон класса MyClass. В классе лежит массив элементов типа T. Вопрос - можно ли как-то штатными средствами отключить у этого массива конструктор, дабы впилить вместо него ленивую инициализацию? Понятно, что можно сделать массив std::aligned_storage<sizeof(T),alignof(T )>::type, но вдруг есть более прямой путь.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2018, 06:46
Ответы с готовыми решениями:

Отключение визуального конструктора VS2019
Поскольку при создании приложения WPF настоятельно не рекомендуется использовать визуальный конструктор (который вследствие неизвестных...

Почему при вызове конструктора из конструктора нельзя передавать this как аргумент?
Есть такой код: public class Order { { } Order(){ this(this.hashCode());//ошибка тут } ...

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и какой плюс от использования перемещающего...

42
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.08.2018, 15:56  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rat0r Посмотреть сообщение
Сложение числа с std::string* это не
Сложение числа с std::string* это синоним &data[pos]. То есть, точно такое же взятие адреса члена объекта, как и &data. Точно так же используемое как void* указатель на storage.
Цитата Сообщение от rat0r Посмотреть сообщение
Для void* арифметика не определена.
Для void* и pointer->data не определено. Вывод - &this->data нарушает стандарт?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.08.2018, 16:24
Лично я бы сделал так:
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
struct Array
{   
    Array(){}
    ~Array()
    {
        for(int i = 0; i < 1234; i++)
        {
            if(hasValue[i])
               reinterpret_cast<std::string *>(data + sizeof(std::string)*i)->~basic_string();
        }
    }
    
    std::string&operator[](std::size_t pos)
    {
        //ленивая инициализация
        if(!hasValue[pos])
        {
            hasValue[pos]=true;
            new (data+sizeof(std::string)*pos) std::string();
        }
        //возвращение нужного значения
        return *reinterpret_cast<std::string *>(data + sizeof(std::string)*pos);
    }
    
    char data[sizeof(std::string) * 1234];  
    bool hasValue[1234]={false};
};
 
int main()
{
    Array test;
    test[3]="1234";
    std::cout<<test[3]<<std::endl;
    return 0;
}
Добавлено через 4 минуты
Или (если памяти на указатели не жалко)
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
36
37
38
39
40
41
42
#define SIZE_ARR     1234
 
struct Array
{   
    Array()
    {
        for(int i = 0; i < SIZE_ARR; i++)
            p_data[i] = reinterpret_cast<std::string *>(data_str + sizeof(std::string)*i);
    }
    ~Array()
    {
        for(int i = 0; i < SIZE_ARR; i++)
        {
            if(hasValue[i])
               p_data[i]->~basic_string();
        }
    }
    
    std::string&operator[](std::size_t pos)
    {
        //ленивая инициализация
        if(!hasValue[pos])
        {
            hasValue[pos]=true;
            new (p_data[pos]) std::string();
        }
        //возвращение нужного значения
        return *p_data[pos];
    }
    
    char data_str[sizeof(std::string) * SIZE_ARR]; 
    std::string *p_data[SIZE_ARR];
    bool hasValue[SIZE_ARR]={false};
};
 
int main()
{
    Array test;
    test[3]="1234";
    std::cout<<test[3]<<std::endl;
    return 0;
}
Добавлено через 1 минуту
SIZE_ARR можно переделать в параметр шаблона, но решил тут оставить так.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
29.08.2018, 16:30
Цитата Сообщение от Renji Посмотреть сообщение
Сложение числа с std::string* это синоним &data[pos].
Точнее, &data[pos] это "синоним" &*((data)+(pos)).

Так вот, хер с &*. data+pos. К data применяется array-to-pointer conversion (сейчас я даже не интересуюсь, можно ли его применять, если никакого массива не существует, сделаю вид, что можно, хотя на самом деле нельзя). В результате получается указатель на первый элемент (элемент чего? массива-то не существует. ладно, вообразим, что получается).
Таки что, складывать с этим указателем числа — это использовать его как если бы он был void*? Очевидно, нет.

Цитата Сообщение от Renji Посмотреть сообщение
Для void* и pointer->data не определено. Вывод - &this->data нарушает стандарт?
Почему?

Добавлено через 3 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
C++
1
2
hasValue[pos]=true;
new (data+sizeof(std::string)*pos) std::string();
Строки в неверном порядке.

Цитата Сообщение от TRam_ Посмотреть сообщение
C++
1
return *reinterpret_cast<std::string *>(data + sizeof(std::string)*pos);
C++
1
return *std::launder(reinterpret_cast<std::string *>(data + sizeof(std::string)*pos));
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.08.2018, 17:07
Цитата Сообщение от rat0r Посмотреть сообщение
Строки в неверном порядке.
То есть? data - массив типа char, так что смещение на 1 элемент есть смещение на 1 байт.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.08.2018, 17:08  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Почему?
Потому что лайфтайм объекта начинается только после завершения его конструктора. Таким образом, если &this->data внутри конструктора и стоит, лайфтайм объекта *this все еще не начался. А дальше смотрите свои же претензии на тему "к элементу чего мы обращаемся, если объекта не существует?".
"The lifetime of an object of type T begins when:
(1.1)
storage with the proper alignment and size for type T is obtained, and
(1.2)
if the object has non-vacuous initialization, its initialization is complete,"
Цитата Сообщение от rat0r Посмотреть сообщение
В результате получается указатель на первый элемент (элемент чего? массива-то не существует. ладно, вообразим, что получается).
Элемент хранилища (storage) выделенного под этот самый массив. Я еще раз повторяю, указатели на storage разрешены.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
29.08.2018, 17:33
Цитата Сообщение от TRam_ Посмотреть сообщение
То есть? data - массив типа char, так что смещение на 1 элемент есть смещение на 1 байт.
Я говорю что строки в неверном порядке. Со смещениями ок.

Цитата Сообщение от Renji Посмотреть сообщение
Потому что лайфтайм объекта начинается только после завершения его конструктора. Таким образом, если &this->data внутри конструктора и стоит, лайфтайм объекта *this все еще не начался.
Так. И?

Цитата Сообщение от Renji Посмотреть сообщение
Элемент хранилища (storage) выделенного под этот самый массив.
Что такое "элемент хранилища"?

Цитата Сообщение от Renji Посмотреть сообщение
Я еще раз повторяю, указатели на storage разрешены.
Можешь хоть 10 раз ещё повторить. А смысл?


[basic.life]/4: The properties ascribed to objects and references throughout this document apply for a given object or reference only during its lifetime.
[conv.array]/1: An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The temporary materialization conversion ([conv.rval]) is applied. The result is a pointer to the first element of the array.

Будет ли в результате array-to-pointer conversion получаться указатель на первый элемент с нужными для арифметики свойствами, если "the array" за пределами своего lifetime? [basic.life]/4 намекает, что нет.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.08.2018, 18:03  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Что такое "элемент хранилища"?
Region of storage который std::string occupies. "An object occupies a region of storage in its period of construction ([class.cdtor]), throughout its lifetime ([basic.life]), and in its period of destruction ([class.cdtor])."
Цитата Сообщение от rat0r Посмотреть сообщение
Так. И?
"И" было в обрезанной вами цитате. Лайфтайм не начался, значит &this->data делает какие-то неправильные указатели на члены не существующего объекта, которыми пользоваться нельзя.
Цитата Сообщение от rat0r Посмотреть сообщение
Будет ли в результате array-to-pointer conversion получаться указатель на первый элемент с нужными для арифметики свойствами, если "the array" за пределами своего lifetime?
Не занимайтесь фигурным квотингом.
[ Note: In particular, before the lifetime of an object starts and after its lifetime ends there are significant restrictions on the use of the object, as described below, in [class.base.init] and in [class.cdtor].
Also, the behavior of an object under construction and destruction might not be the same as the behavior of an object whose lifetime has started and not ended.
[class.base.init] and [class.cdtor] describe the behavior of objects during the construction and destruction phases.
— end note
 ]

Вот значит, смотрим в это самое bellow и ищем там restrictions для указателей. Нет restrictions для указателей, значит указатели работают как положено даже до начала лайфтайма.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
30.08.2018, 04:05
Как-то я не обратил внимания на распространённую ошибку.
Цитата Сообщение от Renji Посмотреть сообщение
"Note: The lifetime of an array object starts as soon as storage with proper size and alignment is obtained, Storage есть? Есть. Lifetime начался
Ты (да и многие) неправильно понимают фрагмент стандарта, где написано "The lifetime of an object of type T begins when: storage with the proper alignment and size for type T is obtained, and if the object has non-vacuous initialization, its initialization is complete" как то, что если нет non-vacuous initialization, то в storage заводятся любые объекты, для которых storage подходит по размерам и выравниванию. (Что, конечно, абсурдно).
Правильный фрагмент: "An object is created by a definition ([basic.def]), by a new-expression, when implicitly changing the active member of a union ([class.union]), or when a temporary object is created ([conv.rval], [class.temporary]).".
Создание объекта начинается с обзаведения стораджем и инициализацией, если она есть. Если нет, то при создании объекта lifetime начинается с обретением стораджа.
Что бы там ни было написано про то, что lifetime массива начинается с обретением стораджа, это не важно, т.к. в данном случае это не действует, т.к. объекта-массива не создают. В случае данного union создавать массив придётся с использованием placement new (неявно lifetime подобных членов union не начинается). Надеюсь, понятно, что для создания массива new должен создавать именно массив? Типа new (&data) std::string[1234];. И привет — вызовы всех конструкторов.

Добавлено через 19 минут
Цитата Сообщение от Renji Посмотреть сообщение
"An object occupies a region of storage in its period of construction ([class.cdtor]), throughout its lifetime ([basic.life]), and in its period of destruction ([class.cdtor])."
Только вот никакого an object, который бы занимался конструкцией, лайфтаймом или деструкцией, в случае array-to-pointer conversion, применённом к data, нет. Непонятно, к чему эта цитата.

Цитата Сообщение от Renji Посмотреть сообщение
Лайфтайм не начался, значит &this->data делает какие-то неправильные указатели на члены не существующего объекта, которыми пользоваться нельзя.
Да не значит. Значит, что ты не прочитал [class.cdtor], хотя говорил, что прочитал.
Цитата Сообщение от Renji Посмотреть сообщение
Вывод - &this->data нарушает стандарт?
Вывод — ты навыделял что-то болдом про то, как pointer may be used, но не понял, что там написано.

Цитата Сообщение от Renji Посмотреть сообщение
Нет restrictions для указателей, значит указатели работают как положено даже до начала лайфтайма.
Откуда это "значит"?
Вот я приводил цитату про то, что свойства объектов, описанные в данном стандарте, верны только на протяжении их lifetime. По-моему, это значит, что array-to-pointer conversion не применим к массивам за пределами их lifetime.
А откуда твоё "значит"? Разрешено всё, что не запрещено? В стандарте это не действует. Там даже где-то написано, что не определенное поведение может говорить о неопределённом поведении. Т.е. общий принцип другой — запрещено всё, что не разрешено явно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.08.2018, 13:06  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Только вот никакого an object, который бы занимался конструкцией, лайфтаймом или деструкцией, в случае array-to-pointer conversion, применённом к data, нет. Непонятно, к чему эта цитата.
Есть subobject "элемент массива", конструкцией которого ленивая инициализация и занимается.
"Objects can contain other objects, called subobjects.
A subobject can be a member subobject ([class.mem]), a base class subobject ([class.derived]), or an array element."
Но у тебя так удивительно получается что субобъект data в operator new пихать можно, а субобъект data[0] нельзя.
Цитата Сообщение от rat0r Посмотреть сообщение
Откуда это "значит"?
Оттуда что еще раз повторяю, не занимайся фигурным квонтингом.
"The properties ascribed to objects and references throughout this document apply for a given object or reference only during its lifetime.
[ Note: In particular, before the lifetime of an object starts and after its lifetime ends there are significant restrictions on the use of the object, as described below, in [class.base.init] and in [class.cdtor].
Also, the behavior of an object under construction and destruction might not be the same as the behavior of an object whose lifetime has started and not ended.
[class.base.init] and [class.cdtor] describe the behavior of objects during the construction and destruction phases.
— end note
 ]"
Таким образом, если не вырывать фразу из контекста, мы видим что речь идет лишь об significant restrictions на использование объекта до начала лайфтайма, а не о невозможности такого использования в принципе. И ограничения эти прописаны во вполне конкретных местах стандарта. Только, про арифметику указателей там ни единого слова.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 10:58
Цитата Сообщение от Renji Посмотреть сообщение
Есть subobject "элемент массива"
Нету, т.к. нет массива. И никогда не было.

Цитата Сообщение от Renji Посмотреть сообщение
конструкцией которого ленивая инициализация и занимается.
То, что в стандарте написано про "under construction" относится к использованию объекта типа класса во время вызова его конструктора.
Ленивая инициализация — это такой приём, идиома.

Цитата Сообщение от Renji Посмотреть сообщение
Но у тебя так удивительно получается что субобъект data в operator new пихать можно, а субобъект data[0] нельзя.
В выражении &data нет array-to-pointer conversion, а в выражении типа &data[0] или data+pos и т.п. есть. Возможность делать array-to-pointer conversion для массива, lifetime которого не начинался (т.е. которого нет), под большим вопросом.

Цитата Сообщение от Renji Посмотреть сообщение
И ограничения эти прописаны во вполне конкретных местах стандарта.
Не факт, что те списки в [basic.life] закрытые. Или если они подразумевались как закрытые — не факт, что они полные.

Могу согласиться только с тем, что отношение стандарта к некоторым конструкциям недоопеределено с той ясностью, с которой должно быть.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2018, 14:45  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
То, что в стандарте написано про "under construction" относится к использованию объекта типа класса во время вызова его конструктора.
Вот placement new и делает вызов конструктора объекта data[pos].
Цитата Сообщение от rat0r Посмотреть сообщение
Не факт, что те списки в [basic.life] закрытые. Или если они подразумевались как закрытые — не факт, что они полные.
Факт что любой член union имеет тот же адрес что сам union ("A union object and its non-static data members are pointer-interconvertible"). Факт что любой C++ массив contiguously allocated. Из этих двух фактов однозначно следует что результат data+pos зависеть от каких-то там конструкторов и деструкторов не может принципиально. Просто не существует механизма который позволил бы конструктору data[0] повлиять на адрес какого либо члена массива.

Разумеется, я допускаю что авторы стандарта сошли с ума и где-то дописали "а вот фиг вам, такая зависимость возможна, так что это UB". Но где именно это написано мы так и не нашли.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 15:51
Renji, всё просто, что я туплю. Смотри сюда.

Допустим даже, что array-to-pointer conversion разрешён и даёт указатель с нужными для арифметики указателей свойствами.

Цитата Сообщение от http://eel.is/c++draft/basic.life#1.sentence-4
The lifetime of an object O of type T ends when:
— if T is a class type with a non-trivial destructor ([class.dtor]), the destructor call starts, or
— the storage which the object occupies is released, or is reused by an object that is not nested within O ([intro.object]).
new (data+pos) std::string(); — это второй пункт, reuse of the storage of an object O of type T, где T == Array, а объект O обозначается переменной test. (Имеется в виду код из поста https://www.cyberforum.ru/post12377777.html)

Осталось проверить, может создаваемый объект nested within O?
Цитата Сообщение от http://eel.is/c++draft/intro.object#def:nested_within
An object a is nested within another object b
— a is a subobject of b, or
— b provides storage for a, or
— there exists an object c where a is nested within c, and c is nested within b.
Отношение nested within транзитивное. Проверим сперва, является ли создаваемый std::string подобъектом массива data (первый пункт)?

Цитата Сообщение от http://eel.is/c++draft/intro.object#2.sentence-4
If an object is created in storage associated with a member subobject or array element E (which may or may not be within its lifetime), the created object is a subobject of E's containing object if:
— the lifetime of E's containing object has begun and not ended, and
— the storage for the new object exactly overlays the storage location associated with E, and
— the new object is of the same type as E (ignoring cv-qualification).
Обрати внимание на первый пункт. Создаваемый с помощью placement new объект std::string не является подобъектом data, т.к. lifetime data никогда не начинался.

Между объектом, создаваемым в строке new (data+pos) std::string(); и объектом Array test нет отношения "nested within". Следовательно, new (data+pos) std::string(); заканчивает lifetime объекта test. Ты прибил объект изнутри его метода. После первого вызова Array::operator[] ты больше не можешь вызывать никакие его методы, т.к.

Цитата Сообщение от [basic.life]/7
Similarly, before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any glvalue that refers to the original object may be used but only in limited ways.
For an object under construction or destruction, see [class.cdtor].
Otherwise, such a glvalue refers to allocated storage ([basic.stc.dynamic.allocation]), and using the properties of the glvalue that do not depend on its value is well-defined.
The program has undefined behavior if:
— the glvalue is used to access the object, or
— the glvalue is used to call a non-static member function of the object, or
— the glvalue is bound to a reference to a virtual base class ([dcl.init.ref]), or
— the glvalue is used as the operand of a dynamic_*cast ([expr.dynamic.cast]) or as the operand of typeid.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2018, 16:29  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Обрати внимание на первый пункт. Создаваемый с помощью placement new объект std::string не является подобъектом data, т.к. lifetime data никогда не начинался.
Обрати внимание на "which may or may not be within its lifetime". "E's containing object" это объект содержащий массив, а не сам массив. Иначе ремарка про "which may or may not be within its lifetime" теряет всякий смысл, по тем самым причинам которые ты только что озвучил.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 16:33
Renji, так и знал, что ты на этом споткнёшься

Перечитай внимательнее. "which may or may not be within its lifetime" относится к элементу массива (E), а сам массив (E's containing object) должен быть within its lifetime.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2018, 16:38  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Перечитай внимательнее. "which may or may not be within its lifetime" относится к элементу массива (E), а сам массив (E's containing object) должен быть within its lifetime.
Чтобы массив был within its lifetime, должен завершиться его конструктор. Что автоматически означает начало лайфтайма всех элементов массива. Поэтому и говорю что в твоей трактовке ремарка смысла не имеет.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 16:41
Цитата Сообщение от Renji Посмотреть сообщение
Чтобы массив был within its lifetime, должен завершиться его конструктор.
Конструкторы всех его элементов. У массивов нет конструкторов.

Цитата Сообщение от Renji Посмотреть сообщение
Поэтому и говорю что в твоей трактовке ремарка смысла не имеет.
Почему это? Создай массив объектов класса с нетривиальными деструкторами, а потом явно вызови деструктор у какого-нибудь из его элементов. Это закончит лайфтайм этого элемента, но не самого массива.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2018, 17:22  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Почему это? Создай массив объектов класса с нетривиальными деструкторами, а потом явно вызови деструктор у какого-нибудь из его элементов. Это закончит лайфтайм этого элемента, но не самого массива.
Ок, принято. Ну, значит имеем недоработку стандарта в котором надо явно прописать что union provides storage для своего содержимого, не более того.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 17:28
Цитата Сообщение от Renji Посмотреть сообщение
Ну, значит имеем недоработку стандарта в котором надо явно прописать что union provides storage для своего содержимого, не более того.
Не думаю, что в этом есть необходимость.
Стандарт легализовал использование массива из unsigned char/std::byte для хранения других объектов (http://eel.is/c++draft/intro.o... es_storage) и этого достаточно.
А что кому-то лень касты писать... ну извините. Это не принципиальная проблема.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2018, 17:41  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Стандарт легализовал использование массива из unsigned char/std::byte для хранения других объектов (http://eel.is/c++draft/intro.o... es_storage) и этого достаточно.
alignas(std::string) unsigned char data[sizeof(std::string)*1234]; это просто не читаемо. А от предложенного в C++11 std::aligned_storage исходный текст лишь раздувается еще больше - std::aligned_storage<sizeof(std::string) ,alignof(std::string)>::type data[1234];. Не, тут именно что в стандарте чего-то менять надо.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.09.2018, 17:44
Renji, https://isocpp.org/std/submit-a-proposal
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2018, 17:44

Вызов конструктора из конструктора и проверка правильности передаваемых параметров
Существует такой код: public Matrix(Double array) : this(array.GetLength(0), array.GetLength(1)) { ...

Передача массива по параметрам конструктора
public class MyClass{ public static void main(String args){ int xMas = {1, 2 ,3 ,4}; int yMas = {1, 3 ,3 ,4}; ...

Инициализация конструктора и конструктора родительского класса
Есть два класса: class C1 { public $a; public $b; public $c; function __construct($a,$b,$c) { ...

Реализация конструктора копирования для двумерного динамического массива
Практически реализовал, не понимаю, почему не получается... #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; ...

Конструктор. Как параметром конструктора назначить элемент массива
Здравствуйте! Пытаюсь создать поле из ячеек, но так, что бы каждая ячейка являлась объектом. Необходимо создать конструктор, который...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru