Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/79: Рейтинг темы: голосов - 79, средняя оценка - 4.53
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776

Размер указателя

25.04.2016, 18:36. Показов 16894. Ответов 75
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
sizeof(void*);// Размер указателя на любой тип равен 8, почему так много? И можно ли как-нибудь узнать сколько под указатель выделено памяти не смотря в исходники?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2016, 18:36
Ответы с готовыми решениями:

Размер строки указателя
char *str = new char ; str = "123"; sizeof(str) - отображает размер указателя, а как вывести размер самой строки строки?

Размер указателя short int
Доброе утро. Возник вопрос почему short int = 8 байт? Он же должен занимать 2 байта в 32-х разрядной среде. #include...

Размер указателя на разные типы данных
еще один вопрос к етой теме почуму придавая указателю * prt тип short int или double функция sizeof так же выводит 4 как при int?

75
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
26.04.2016, 22:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
А дельта эта сама собой из памяти прочитается и сама собой от this отнимется? Вместо одной "вызывалки", вам придется генерировать (пусть и неявно) тучу читалок и вычиталок.
Наоборот, так как в "моем" случае "дельта" - это run-time value, хранимое в самом указателе, вызывалка понадобится одна-единственная. Обычно никакая вызывалка вообще не генерируется - все манипуляции с this делаются inline непосредственно в точке вызова.

Цитата Сообщение от Renji Посмотреть сообщение
И они будут сложнее, а значит тормознутее моей вызывалки.
"Сложнее"? Все, что делает эта одна-единственная вызывалка - это корректирует значение this и передает управление по указателю на метод. Ничего сложного тут нет.

"Тормознутее", она, конечно, будет из-за того, что при вызове значение "дельта" читается из памяти (т.е. из указателя), в то время как в вашем случае дельта прошита непосредственно в код. Но если учесть, что мы в это время занимаемся вызовом функции по прочитанному из памяти указателю, "торможение" это - чисто теоретическое.

Цитата Сообщение от Renji Посмотреть сообщение
Потому как моя вызывалка вычитает зашитую в ассемблерный код константу
Совершено верно. Вот именно про этой причине вам понадобится много вызвалок - отдельная вызывалка для каждого значения этой константы, в то время как мне достаточно одной вызывалки.

Цитата Сообщение от Renji Посмотреть сообщение
Разница в том, что Child в вашем коде вообще никак не использовался. Если его определение удалить, код все равно будет компилироваться.
Что-то вы ерунду какую-то говорите. В моем коде Child не просто используется, а используется важнейшим образом! В моем коде метод foo наследуется в класс Parent именно из класса Child. Именно по этой причине в моем коде &Parent::foo имеет тип void (Child::*)(). Эта деталь - ключевой момент моего кода.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.04.2016, 23:00
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Наоборот, так как в "моем" случае "дельта" - это run-time value, хранимое в самом указателе, вызывалка понадобится одна-единственная. Обычно никакая вызывалка вообще не генерируется - все манипуляции с this делаются inline непосредственно в точке вызова.
Вот я про этот inline и говорю. В моем варианте в точке вызова стоит один единственный call. В вашем варианте перед этим call стоят еще mov (чтоб прочитать дельту) и sub (чтоб вычесть). И точка вызова в итоге толстеет, а какой смысл в этом - непонятно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В моем коде метод foo наследуется в класс Parent именно из класса Child.
Кого-то из нас глючит - я не вижу в классе Parent никаких наследований.
C++
1
2
3
struct Parent {
  void foo() {}
};
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
26.04.2016, 23:17
Цитата Сообщение от Renji Посмотреть сообщение
Кого-то из нас глючит - я не вижу в классе Parent никаких наследований.
Глючу я. Прошу прощения. Пример был задуман такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Parent {
  void foo() {}
};
 
struct Child : Parent {
};
 
int main() {
  void (Child::*p)() = &Child::foo; // &Child::foo - это void (Parent::*)()
  Child o;
  (o.*p)();
}
Но тогда этот пример уже не имеет отношения к тому, о чем вы говорили - преобразовании void (Child::*)() в void (Parent::*)()

Для этого нужен другой пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Parent {
};
 
struct Child : Parent {
  void foo() {}
};
 
int main() {
  void (Parent::*p)() = static_cast<void (Parent::*)()>(&Child::foo);
  Child co;
  Parent *po = &co;
  (po->*p)();
}
но мы аналогичный пример уже приводили.

Добавлено через 8 минут
Цитата Сообщение от Renji Посмотреть сообщение
Вот я про этот inline и говорю. В моем варианте в точке вызова стоит один единственный call. В вашем варианте перед этим call стоят еще mov (чтоб прочитать дельту) и sub (чтоб вычесть). И точка вызова в итоге толстеет
Но в вашем варианте call не единственен - он идет в вызывалку, которая после коррекции this будет делать еще один call - уже в реальный метод.

Это в "моем" случае call как раз таки будет единственным. А коррекция this из памяти выливается в "традиционной" реализации в единственную машинную инструкцию. Поэтому причин для жалоб на раздувание кода я тут не вижу.

Еще неизвестно, что хуже...

Не знаю, зачем тут ваш "mov и sub". Обычно this готовится в rcx, т.е. для коррекции this достаточно add rcx, [память], т.е. никакого mov. Разумеется, на платформе, поддерживающей арифметику регистр-память.

Цитата Сообщение от Renji Посмотреть сообщение
а какой смысл в этом - непонятно.
А вот это интересно... Я вот навскидку не знаю примера, но не будут ли тут где-то возникать ситуации, когда в вашем варианте надо будет подменять "дельту" в самом указателе, т.е. перецеплять ее с одной вызывалки на другую? Надо подумать...
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.04.2016, 23:46
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Глючу я. Прошу прощения. Пример был задуман такой:
А, ну здесь да, преобразование имеет смысл. Но и обсуждаемых проблем не возникает.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но в вашем варианте call не единственен - он идет в вызывалку, которая после коррекции this будет делать еще один call - уже в реальный метод.
В моем варианте реальный метод заинлайнится в вызывалку. Но у меня он заинлайнится один раз (метод больше нигде напрямую не вызывается), а у вас инлайн будет в каждой точке вызова. С необходимостью mov действительно попутал, но лишняя команда на каждый вызов все равно выходит.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А вот это интересно... Я вот навскидку не знаю примера, но не будут ли тут где-то возникать ситуации, когда в вашем варианте надо будет подменять "дельту" в самом указателе, т.е. перецеплять ее с одной вызывалки на другую? Надо подумать...
Откуда им возникать, если смещение предка относительно потомка задается на стадии компиляции? Максимум, ромбовидное наследование потребует две вызывалки для одного метода. Но ромбовидное наследование - само по себе разновидность сексуального извращения.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
27.04.2016, 00:10
del
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 00:18
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так как вы собираетесь прилепить к делу вашу вызывалку так, чтобы получился "всего один call"?
Конкретно здесь я собираюсь потребовать неявное приведение parrrrgh к S*.
0
 Аватар для Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
27.04.2016, 10:17
Снова вернулся к этой теме - уж больно она мне покоя не дает.
Итак, поигрался я немного с битовыми полями - и получается, что указатель размером 32 бита при условии что из этого указателя один бит забирает система на свои нужды как раз способен проиндексировать только 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
 
struct
{
    unsigned int pt : 31;   //переменная размером 31 бит
} test_ptr;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    test_ptr.pt = 0;
 
    test_ptr.pt--;
    int bt(0), kb(0), mb(0), gb(0), tb(0);
 
    if (test_ptr.pt >= 1024)
    {
        bt = test_ptr.pt % 1024;    //перводим в байты
        test_ptr.pt /= 1024;
    }
    else
    {
        bt = test_ptr.pt;
        test_ptr.pt = 0;
    }
    if (test_ptr.pt >= 1024)
    {
        kb = test_ptr.pt % 1024;    //перводим в килобайты
        test_ptr.pt /= 1024;
    }
    else
    {
        kb = test_ptr.pt;
        test_ptr.pt = 0;
    }
    if (test_ptr.pt >= 1024)
    {
        mb = test_ptr.pt % 1024;    //перводим в мегобайты
        test_ptr.pt /= 1024;
    }
    else
    {
        mb = test_ptr.pt;
        test_ptr.pt = 0;
    }
    if (test_ptr.pt >= 1024)
    {
        gb = test_ptr.pt % 1024;    //перводим в Гигобайты
        test_ptr.pt /= 1024;
    }
    else
    {
        gb = test_ptr.pt;
        test_ptr.pt = 0;
    }
 
    tb = test_ptr.pt;
 
    std::cout << tb << " Tb " << gb << " Gb " << mb << " Mb " << kb << " Kb " << std::endl;
    
 
    system("pause");
    return 0;
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 13:12
Че-то вы увлеклись, и за деревьями леса не видите. А надо всего лишь задаться вопросом, почему нельзя, например, передать указатель на член как void*? В указателе на член потомка может быть как указатель на член потомка, так и указатель на член предка. Один this надо корректировать, другой нет. И известно это только в рантайме. Поэтому без дополнительного ptrdiff_t не обойтись.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 13:48
Цитата Сообщение от avgoor Посмотреть сообщение
В указателе на член потомка может быть как указатель на член потомка, так и указатель на член предка. Один this надо корректировать, другой нет. И известно это только в рантайме.
Корректировать this надо только при множественном наследовании в потомке. А есть оно там или нет - известно на стадии компиляции. Поэтому, нужен ptrdiff_t или нет, тоже ясно на стадии компиляции. Мы же тут обсуждаем случай когда в указатель на член предка пихают указатель на член потомка. Что как бы само по себе сексуальное извращение, из серии "заряжать мушкет (предок) патронами от калаша (потомок)". Причем, проблемы создаваемые этим сексуальным извращением, могут быть решены и без ptrdiff_t (патрон из калаша сразу делается с прицелом на то что его сунут в мушкет и хранит в себе ptrdiff_t).
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 14:18
Цитата Сообщение от Renji Посмотреть сообщение
только при множественном наследовании в потомке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
class Foo;
void (Foo::*p)();//Определите, есть ли здесь множественное наследование
 
class Foo
{
public:
    void foo()
    {
        std::cout << "foo";
    }
};
int main()
{
    Foo foo;
    p = &Foo::foo;
    (foo.*p)();
}
Добавлено через 4 минуты
Цитата Сообщение от Renji Посмотреть сообщение
когда в указатель на член предка пихают указатель на член потомка
В общем случае - UB.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 15:34
Цитата Сообщение от avgoor Посмотреть сообщение
Определите, есть ли здесь множественное наследование
Решается ключевым словом multiple_inheritance в опережающем объявлении класса.
Предупреждая "фи, как неудобно" - сделайте преобразование "указатель на метод предка->указатель на метод потомка" без плясок с бубном, но с множественным наследованием ромбом. Множественное наследование как бы изначально источник не очевидных грабель. И не особо понятно почему страдать от этих грабель должны не 1% пользователей множественного наследования, а 99% тех, кому оно даром не нужно. Особенно, если цена вопроса - одно ключевое слово.
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
struct Rhombus;
void (Rhombus::*p)();
 
struct A
{
    void foo(){}
};
 
struct B:virtual A
{
};
 
struct C:virtual A
{
};
 
struct Rhombus:B,C
{
};
 
int main()
{
    Rhombus rhombus;
    A*a=&rhombus;//работает
    p=static_cast<void(Rhombus::*)()>(&A::foo);//не работает
    return 0;
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 15:52
Цитата Сообщение от Renji Посмотреть сообщение
Решается ключевым словом multiple_inheritance в опережающем объявлении класса
Вы сами себя слышите? Сделать ключевое слово, сделать указатели на член разного размера, вхардкодить константы и перекомпилировать весь проект, если размер класса поменялся. И все это, чтобы сэкономить сотню байт памяти (сколько там этих указателей на член?)

Добавлено через 7 минут
А самое главное терятся весь смысл в предобъявлении (чем больше надо знать про класс - тем больше предобъявление становится похожим на определение).
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 15:57
Цитата Сообщение от avgoor Посмотреть сообщение
Вы сами себя слышите? Сделать ключевое слово, сделать указатели на член разного размера, вхардкодить константы и перекомпилировать весь проект, если размер класса поменялся.
Ой, ё... Давайте на пальцах. Создание 16 байтового указателя с ptrdiff_t:
1) Сохранение адреса метода.
2) Сохранение ptrdiff_t, что внезапно требует "вхардкодить константы" в каждую точку создания этого самого указателя.
Вызов по 16 байтовому указателю:
1) Прочитать адрес метода.
2) Вычесть ptrdiff_t из указателя на объект. Вхардкордив это вычитание в каждую точку вызова.
3) Вызвать метод.

Создание 8-байтового указателя без ptrdiff_t:
1) Сохранить адрес метода.
Вызов по 8-байтовому указателю:
1) Прочитать адрес метода.
2) Вызвать метод. "Вычесть ptrdiff_t из указателя на объект" делает код метода, в который ptrdiff_t Вхардкорден один раз.

Не замечаете что в моем варианте число действий меньше, а код компакней и быстрее?
Цитата Сообщение от avgoor Посмотреть сообщение
И все это, чтобы сэкономить сотню байт памяти (сколько там этих указателей на член?)
И все это раздувание кода, лишь потому что у 1% кодеров отвалятся руки одно лишнее слово набрать.
Цитата Сообщение от avgoor Посмотреть сообщение
А самое главное терятся весь смысл в предобъявлении (чем больше надо знать про класс - тем больше предобъявление становится похожим на определение).
При этом в шаблонах подписываем typename перед каждым именем класса (не только аргументами шаблона) и не жалуемся.
Смысл в предобъявлении в том, чтобы разрешить рекурсивные зависимости (в классе А ссылки на класс Б, в классе Б ссылки на класс А). И этому ключевое слово не мешает никак.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 16:06
Цитата Сообщение от Renji Посмотреть сообщение
Вызвать метод. "Вычесть ptrdiff_t из указателя на объект" делает код метода, в который ptrdiff_t Вхардкорден один раз.
То есть для потомка и для предка - две разные реализации метода? (как foo() будет отличать Parent.foo() и (child.*ptr)())?
Цитата Сообщение от Renji Посмотреть сообщение
При этом в шаблонах подписываем typename
Только чтобы помочь компилятору (сохранить LR1 грамматику).
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 16:20
Цитата Сообщение от avgoor Посмотреть сообщение
То есть для потомка и для предка - две разные реализации метода? (как foo() будет отличать Parent.foo() и (child.*ptr)())?
Проще: при вызове по указателю, попадаем на заглушку из двух ассемблерных строчек:
Assembler
1
2
sub ecx,1234 (приведение this к каноническому Parent*)
jmp start_foo; (goto на начало foo)
Если заглушка у нас всего одна, jmp вообще выкидывается.
Цитата Сообщение от avgoor Посмотреть сообщение
Только чтобы помочь компилятору (сохранить LR1 грамматику).
Так и здесь помогаем компилятору понять нужна ли поддержка множественного наследования. Судя по тому что в Шарпе ее вообще выпилили, в 99% случаев она не нужна.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 16:25
Вот вам пример без всякого множественного наследования:
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
class A
{
    int i;
public:
    A() : i(1) {}
    void foo() { std::cout << i; }
};
class B : public A
{
    int i;
public:
    B() : i(2) {}
    void foo() { std::cout << i; }
};
class C : public B
{
    int i;
public:
    C() : i(3) {}
    void foo() { std::cout << i; }
};
 
void callFoo(C& c, void (C::*ptr)())
{
    (c.*ptr)(); // Что здесь откуда вычитать, если вы не храните ptrdiff
}
 
int main()
{
    C c;
    callFoo(c, &A::foo);
    callFoo(c, &B::foo);
    callFoo(c, &C::foo);
}
Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Так и здесь помогаем компилятору понять нужна ли поддержка множественного наследования.
Нетъ.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 16:45
Цитата Сообщение от avgoor Посмотреть сообщение
Вот вам пример без всякого множественного наследования:
Без множественного наследования ptrdiff ВСЕГДА равен нулю, а потому не нужен.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    C c;
    if((void*)static_cast<A*>(&c) == (void*)&c &&
            (void*)static_cast<B*>(&c) == (void*)&c)
        cout<<"Что здесь откуда вычитать, если преобразования НЕ меняют указатель?"<<endl;
    callFoo(c, &A::foo);
    callFoo(c, &B::foo);
    callFoo(c, &C::foo);
}
Добавлено через 5 минут
UPD Хотя нет, вру, при добавлении виртуальных методов, база смешается. В таком случае компилятор, в моем представлении, должен разворачивать код примерно в следующее:
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
43
44
45
46
#include <iostream>
 
using namespace std;
 
class C;
class A
{
    int i;
public:
    A() : i(1) {}
    void _foo() { std::cout << i; }
    static void foo(C*_this);
};
class B : public A
{
    int i;
public:
    B() : i(2) {}
    void _foo() { std::cout << i; }
    static void foo(C*_this);
};
class C : public B
{
    int i;
public:
    C() : i(3) {}
    void _foo() { std::cout << i; }
    static void foo(C*_this);
};
 
void A::foo(C *_this){static_cast<A*>(_this)->_foo();}
void B::foo(C *_this){static_cast<B*>(_this)->_foo();}
void C::foo(C *_this){static_cast<C*>(_this)->_foo();}
 
void callFoo(C& c, void (*ptr)(C*))
{
    (*ptr)(&c);
}
 
int main()
{
    C c;
    callFoo(c, &A::foo);
    callFoo(c, &B::foo);
    callFoo(c, &C::foo);
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 17:01
Цитата Сообщение от Renji Посмотреть сообщение
UPD Хотя нет, вру, при добавлении виртуальных методов,
Вот блин, опередил, (я ж специально, потом хотел написать: а если...)
Цитата Сообщение от Renji Посмотреть сообщение
Судя по тому что в Шарпе ее вообще выпилили
Не вообще, а только реализацию. Интерфейсы (которые как раз виртуальные) можно. Что возвращает нас к необходимости хранения смещения.

Добавлено через 6 минут
Если так разворачивать, то на каждую пару в иерархии потребуется свой метод (Если классов 10 потребуется 90 оберток, вместо одного ptrdiff)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.04.2016, 17:34
Цитата Сообщение от avgoor Посмотреть сообщение
Если так разворачивать, то на каждую пару в иерархии потребуется свой метод
Не на каждую пару, а только на пару реально требующую преобразований. То есть, если не используется преобразования void (A::*)()->void(B::*)(), то и обертку для него генерировать не нужно.
Цитата Сообщение от avgoor Посмотреть сообщение
Если классов 10 потребуется 90 оберток, вместо одного ptrdiff
Одного ptrdiff, 90 инициализаций ptrdiff и 90 копирований ptrdiff в аргументы callFoo. И помножить все на десять, если число вызовов callFoo вдруг увеличится. Замечательная альтернатива, учитывая что все это будет жрать время на стадии исполнения, а не компиляции.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.04.2016, 19:36
Цитата Сообщение от Renji Посмотреть сообщение
если число вызовов callFoo вдруг увеличится
Будут ли ваши обертки инлайниться? Если да, то какая разница между ними и ptrdiff (учитывая, что и то и то в кэше)? Если нет то как два вызова улучшат код?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2016, 19:36

Как верно узнать размер указателя ?
СBaseTest* pTest = { new СBaseTest, new СOther }; Нужно узнать размер pTest

Объяснить от чего зависит размер указателя и что такое арифметика указателей
Уважаемые программисты, возник вопрос. По умолчанию указатель любого типа может иметь только 4 байта. Но взглянем на следующий код: ...

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

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; class B{ public:

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru