Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/35: Рейтинг темы: голосов - 35, средняя оценка - 4.63
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Вызов конструктора базового класса

14.05.2019, 11:44. Показов 7974. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Создаю класс-наследник std::string. У базового класса есть конструктор копии: std::string(const std::string& str). Правильно ли я создаю конструктор копии для своего класса?
C++
1
2
3
4
5
class IString : public std::string
{
 public:
 IString(const IString& String) : std::string(String) {}
};
Такой код работает, но смущает то, что я в конструктор копии класса std::string передаю объект типа IString.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2019, 11:44
Ответы с готовыми решениями:

Вызов конструктора базового класса
Здравствуйте! Я вот начал изучать C# и немножечко освежил ООП. Но вот у меня вопрос. Я точно помню, что класс-наследник (конструкторы не...

Вызов конструктора базового класса из порожденного
Есть Базовый класс студент: имеет поля: фамилия, адрес, тел., возраст. Порожденный класс группа: имя группы, кол-во студентов в...

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a; public: A(int c):a(c){} ...

73
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
14.05.2019, 13:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от eva2326 Посмотреть сообщение
Шта? щ_Щ
=.=
Цитата Сообщение от expr.delete
In a single-object delete expression, if the static type of the object to be deleted is different from its dynamic type and the selected deallocation function (see below) is not a destroying operator delete, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined. In an array delete expression, if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
2
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2019, 13:15
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ну не вызовется деструктор ~IString, ну и что? Ведь в нем все равно нет никакого кода.
Сегодня нет, завтра появится. Будешь потом искать утечки памяти.
Тут важно соблюдать правила, чтоб у тебя это закрепилось на уровне рефлексов.
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
14.05.2019, 13:21  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Тут важно соблюдать правила, чтоб у тебя это закрепилось на уровне рефлексов.
С этим не могу поспорить...
Значит выход один - использовать композицию?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.05.2019, 13:25
Цитата Сообщение от eva2326 Посмотреть сообщение
Шта? щ_Щ
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ну не вызовется деструктор ~IString, ну и что?
если delete применяется к указателю на базовый класс для наследника,
у которого отсутствует виртуальный деструктор,
то поведение не определено.

UB в действии:

https://rextester.com/XMEVIJ77333

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
#include <iostream>
#include <string>
 
class mystring : public std::string
{
    using base = std::string;
public:
    using base::base;
    
    int a[255];
};
 
class some 
{
    int a[255];
};
 
 
class der: public some, public mystring
{
};
 
int main()
{
    mystring* ptr = new der;
    delete ptr;
}
output:

Code
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
43
44
45
46
47
48
49
Error(s):
*** Error in `/var/www/service/usercode/982667182/a.out': free(): invalid pointer: 0x00000000022ed020 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f473a9d27e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x7fe0a)[0x7f473a9dae0a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f473a9de98c]
/var/www/service/usercode/982667182/a.out[0x40069f]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f473a97b830]
/var/www/service/usercode/982667182/a.out[0x400709]
======= Memory map: ========
00400000-00401000 r-xp 00000000 b6:3c7d1 3045200                         /var/www/service/usercode/982667182/a.out
00600000-00601000 r--p 00000000 b6:3c7d1 3045200                         /var/www/service/usercode/982667182/a.out
00601000-00602000 rw-p 00001000 b6:3c7d1 3045200                         /var/www/service/usercode/982667182/a.out
022db000-0230d000 rw-p 00000000 00:00 0                                  [heap]
7f4734000000-7f4734021000 rw-p 00000000 00:00 0 
7f4734021000-7f4738000000 ---p 00000000 00:00 0 
7f473a43c000-7f473a452000 r-xp 00000000 b6:3c7d1 105                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f473a452000-7f473a651000 ---p 00016000 b6:3c7d1 105                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f473a651000-7f473a652000 rw-p 00015000 b6:3c7d1 105                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f473a652000-7f473a75a000 r-xp 00000000 b6:3c7d1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7f473a75a000-7f473a959000 ---p 00108000 b6:3c7d1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7f473a959000-7f473a95a000 r--p 00107000 b6:3c7d1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7f473a95a000-7f473a95b000 rw-p 00108000 b6:3c7d1 10854                   /lib/x86_64-linux-gnu/libm-2.23.so
7f473a95b000-7f473ab1a000 r-xp 00000000 b6:3c7d1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7f473ab1a000-7f473ad1a000 ---p 001bf000 b6:3c7d1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7f473ad1a000-7f473ad1e000 r--p 001bf000 b6:3c7d1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7f473ad1e000-7f473ad20000 rw-p 001c3000 b6:3c7d1 10849                   /lib/x86_64-linux-gnu/libc-2.23.so
7f473ad20000-7f473ad24000 rw-p 00000000 00:00 0 
7f473ad24000-7f473ad3c000 r-xp 00000000 b6:3c7d1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f473ad3c000-7f473af3b000 ---p 00018000 b6:3c7d1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f473af3b000-7f473af3c000 r--p 00017000 b6:3c7d1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f473af3c000-7f473af3d000 rw-p 00018000 b6:3c7d1 10855                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f473af3d000-7f473af41000 rw-p 00000000 00:00 0 
7f473af41000-7f473b0b3000 r-xp 00000000 b6:3c7d1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f473b0b3000-7f473b2b3000 ---p 00172000 b6:3c7d1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f473b2b3000-7f473b2bd000 r--p 00172000 b6:3c7d1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f473b2bd000-7f473b2bf000 rw-p 0017c000 b6:3c7d1 3213                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f473b2bf000-7f473b2c3000 rw-p 00000000 00:00 0 
7f473b2c3000-7f473b2e9000 r-xp 00000000 b6:3c7d1 10838                   /lib/x86_64-linux-gnu/ld-2.23.so
7f473b4b4000-7f473b4ba000 rw-p 00000000 00:00 0 
7f473b4e5000-7f473b4e8000 rw-p 00000000 00:00 0 
7f473b4e8000-7f473b4e9000 r--p 00025000 b6:3c7d1 10838                   /lib/x86_64-linux-gnu/ld-2.23.so
7f473b4e9000-7f473b4ea000 rw-p 00026000 b6:3c7d1 10838                   /lib/x86_64-linux-gnu/ld-2.23.so
7f473b4ea000-7f473b4eb000 rw-p 00000000 00:00 0 
7ffecd116000-7ffecd12b000 rw-p 00000000 00:00 0                          [stack]
7ffecd135000-7ffecd137000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
 
Abort signal from abort(3) (SIGABRT)
виртуальный деструктор не нужен,
если у наследника нет своих собственных членов-данных.

то есть, если sizeof(der) == sizeof(base),
тогда проблем не будет.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я бы не стал на это закладываться.
почему нет?
а если программист ничайно позабудет - ему компилятор напомнит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class mystring : public std::string
{
    using base = std::string;
public:
    using base::base;
private:
    void check() noexcept
    {
        static_assert(
            sizeof(base) == sizeof(mystring )
        );
    }
};
3
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
14.05.2019, 13:28
Цитата Сообщение от d7d1cd Посмотреть сообщение
Значит выход один - использовать композицию?
Нет, выходов здесь множество. В том числе и ваш вариант тоже правомерен в случае правильного использования.

Вместо композиции можно использовать закрытое наследование, с выделением нужных функций из базового класса, например:
C++
1
2
3
4
5
6
class String : private std::string
{
public:
    using std::string::string;
    using std::string::substr;
};
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2019, 13:28
Цитата Сообщение от d7d1cd Посмотреть сообщение
Значит выход один - использовать композицию?
А зачем тебе вообще нужен этот IString, если в нём нет никаких данных? Если только ради конструкторов, сделай лучше функцию std:string make_string(.......);
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
14.05.2019, 13:33
Цитата Сообщение от hoggy Посмотреть сообщение
виртуальный деструктор не нужен,
если у наследника нет своих собственных членов-данных.
то есть, если sizeof(der) == sizeof(base),
тогда проблем не будет.
И как это проверить? Если программа не упала, знач все ок?
В стандарте не вижу исключений, такого рода.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
14.05.2019, 13:39  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Вместо композиции можно использовать закрытое наследование, с выделением нужных функций из базового класса
Ну тут все равно нарушается принцип "Наследование от класса без виртуального деструктора - не есть хорошо!"

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А зачем тебе вообще нужен этот IString, если в нём нет никаких данных?
Ну почему же не будет? Может и будут (например, int или char). Но ведь освобождение памяти, занятое ими, будет проходить без проблем?..

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Если только ради конструкторов, сделай лучше функцию std:string make_string(.......);
Ну как бы хочется применять ООП, а не методы С.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
14.05.2019, 13:44
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ну тут все равно нарушается принцип "Наследование от класса без виртуального деструктора - не есть хорошо!"
Как однажды мне сказал один человек:
"Ты пишешь код и выражаешь мысль, современный код это и инструкции для процессора ( в конечном счете) и роман для другого программиста. Поэтому как роман составленный из шаблонов из методички будет смотреться "не очень", так и программа, наполненная бездумно вставленным кодом, обоснование которому "так принято", - тоже.".
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ну как бы хочется применять ООП, а не методы С.
А что такое ООП?))
Не вижу что бы вы следовали особо каким-то принципам, например, SOLID?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
14.05.2019, 13:53
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ну тут все равно нарушается принцип "Наследование от класса без виртуального деструктора - не есть хорошо!"
Нет, не нарушается.

Да и принципа такого нет. Есть общая рекомендация, которую выработали для общего случая. Однако в частном случае ее можно и не применять - если это обосновано.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.05.2019, 13:57
Цитата Сообщение от Azazel-San Посмотреть сообщение
И как это проверить?
почитать документацию: как работают new/delete

Цитата Сообщение от Azazel-San Посмотреть сообщение
В стандарте не вижу исключений, такого рода.
стандарт ясно даёт понять:
если нет виртуального деструктора,
то случится две вещи:
1.
деструктор наследника не будет запущен.

2.
за размер куска памяти,
который нужно освободить,
будет принят sizeof(object) удаляемого объекта.

выше я привел пример, где случился краш.
почему случился краш?

причина - множественное наследование.
получилось так,
что delete попыталась освободить только часть памяти,
(удалить один из подобъектов)
вместо того, что бы освободить всю память,
которая была захвачена у системы посредством new.

так делать нельзя.
нельзя запросить целое, а вернуть только половину.

если у класса нет собственных членов-данных,
стало быть размер наследника совпадает с размером базового класса,
следовательно new/delete априори будет аллоцировать/освобождать
тот же самый кусок памяти,
даже с учетом множественного наследования.

убираем данные-члены из классов, и вуаля!
проблем никаких.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
 
class mystring : public std::string
{
    using base = std::string;
public:
    using base::base;
};
 
class some 
{
};
 
class der: public some, public mystring
{
};
 
int main()
{
    mystring* ptr = new der;
    delete ptr;
}
понятно, что само по себе отсутствие данных-членов
у конкретного наследника ещё ничего не гарантирует.

важно, что бы либо не было множественного наследования,
либо классы-участники в множественном наследовании
так же не имели данных-членов.

короче, смысл простой:
нужно гарантировать что удаляется тот же самый кусок памяти,
что был захвачен при помощи new

Добавлено через 1 минуту
Цитата Сообщение от d7d1cd Посмотреть сообщение
Ну тут все равно нарушается принцип "Наследование от класса без виртуального деструктора - не есть хорошо!"
потому что так петух на горе прокукарекал?

или ты сейчас сможешь ответить на вопрос:
"почему не есть хорошо?"
4
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
14.05.2019, 14:08
Цитата Сообщение от hoggy Посмотреть сообщение
убираем данные-члены из классов, и вуаля!
проблем никаких.
Как это влияет на присутствие неопределенного поведения в коде?
Речь-то о том, что подобный код приводит к неопределенному поведению.
Код с UB может вполне нормально работать, однако UB как было, так и остается.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
14.05.2019, 14:09
Цитата Сообщение от Croessmah Посмотреть сообщение
Речь-то о том, что подобный код приводит к UB.
Ну, как я понимаю
Цитата Сообщение от hoggy Посмотреть сообщение
смысл простой:
нужно гарантировать что удаляется тот же самый кусок памяти,
что был захвачен при помощи new
А такую гарантию мы имеем.

Остальное на свой риск, как всегда?)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
14.05.2019, 14:11
Цитата Сообщение от Azazel-San Посмотреть сообщение
А такую гарантию мы имеем.
Вы не имеете гарантий от стандарта, что это будет работать.
UB на то и UB, что никаких гарантий со стороны стандарта нет.
Всё что без гарантий - всегда на свой страх, риск, опыт, знание реализации.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
14.05.2019, 15:14  [ТС]
Уфф! Здорово! Спасибо за информацию всем!
Мне непонятен следующий момент. Есть базовый класс без виртуального деструктора, а так же есть наследник этого класса с полем простого типа. Произойдет ли корректное освобождение памяти, занятой этим полем, в следующем коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
 int* a;
 
 public:
 A() { a = new int; }
 ~A() { delete a; }
};
 
class B : public A
{
 int c;   
};
 
int main()
{
 A* a = new B;
 delete a; 
 return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2019, 15:36
Цитата Сообщение от d7d1cd Посмотреть сообщение
Мне непонятен следующий момент. Есть базовый класс без виртуального деструктора, а так же есть наследник этого класса с полем простого типа. Произойдет ли корректное освобождение памяти, занятой этим полем, в следующем коде:
Сделай
C++
1
2
3
4
5
6
7
8
class A
{
 int* a;
 
 public:
 A() { std::cout << __FINCTION__ << std::endl; a = new int; }
 ~A() { std::cout << __FINCTION__ << std::endl; delete a; }
};
Ии посмотри. То же самое для B
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
14.05.2019, 15:56
Цитата Сообщение от d7d1cd Посмотреть сообщение
роизойдет ли корректное освобождение памяти, занятой этим полем, в следующем коде:
Нет конечно же, о чем мы вам втолкмачивали последние сообщений 10?
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
14.05.2019, 16:11  [ТС]
То есть, мои слова о том, что в созданном по умолчанию деструкторе нет кода, неверны. Там есть код освобождения памяти, которую занимали поля класса. Я все правильно понимаю?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
14.05.2019, 17:19
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

Цитата Сообщение от hoggy Посмотреть сообщение
виртуальный деструктор не нужен,
если у наследника нет своих собственных членов-данных.
то есть, если sizeof(der) == sizeof(base),
тогда проблем не будет.
Пробуем

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct A
{
  int a, b, c;
};
 
struct B : A
{
  static void *operator new(std::size_t s)
  {
    return (char *) std::malloc(s + 100) + 100;
  }
    
  static void operator delete(void *p)
  {
    std::free((char *) p - 100);
  }
};
 
int main()
{
  A *p = new B;
  delete p;
}
У наследника нет своих членов-данных. И даже sizeof(A) == sizeof(B). Однако хрясь

Code
1
*** Error in `./a.out': free(): invalid pointer: 0x0000000001449c84 ***
Добавляем виртуальный деструктор в A и - о чудо - вдруг все заработало!

Добавлено через 4 минуты
Цитата Сообщение от d7d1cd Посмотреть сообщение
Мне непонятен следующий момент. Есть базовый класс без виртуального деструктора, а так же есть наследник этого класса с полем простого типа. Произойдет ли корректное освобождение памяти, занятой этим полем, в следующем коде
Вам же ясно сказали - произойдет неопределенное поведение. Нет никакого смысла говорить ни о каких "полях". Неопределенное поведение.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
14.05.2019, 17:25
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
C++
1
return (char *) std::malloc(s + 100) + 100;
А в чем смысл в конце +100 добавлять?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Однако хрясь
Потому что B::operator delete не будет вызван?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2019, 17:25
Помогаю со студенческими работами здесь

Знакомство с наследованием. Вызов конструктора базового класса
В инете немного почиатл про наследование и решил сразу перейти к практике Есть два класа point и apoint вот хидер #ifndef...

Вызов базового конструктора
Такая вот ситуация. Думаю, проблема в объявлении и инициализации массива m. Я бы инициализировал уже в конструкторе, но сначала вызовет...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний треугольник.В конструкторе треугольника вводятся...

Наследование конструктора из базового класса
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; //////////////////// class String { ...

Инициализация конструктора базового класса
class animal { public: animal(int a):ianimal(a){} protected: int ianimal; }; class bird:public animal


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru