Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
1

указатели на элементы класса

11.09.2012, 18:57. Показов 6903. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
есть код:

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
class A
{
    public:
    void C(void){return;}
        static int D(void){return 0;}
    int a;
        static int d;
};
 
int main(int argc, char** argv)
{
        A a_obj;
    int (A:: *p)= &A::a;// - работает
        //int *p= &a_obj.a; - не работает
        //int *p= &A::a; - не работает
        void (A::*f)(void)= &A::C; // - работает
        //void (*f)(void)= &A::C; - Не работает
        //void (*f)(void)= &a_obj.C; - Не работает
        int *e1= &a_obj.a;// - Работает
        int *e2= &A::a;// - Работает
        int (*F1)(void)= &A::D;// - работает
        int (*F2)(void)= &a_obj.D;// - работает
    system("Pause");
    return 0;
}
Знаю, что в не статическую функцию Неявно передается this, т.е. выходит вместо параметра (void), по сути параметр (this) в методе C и т.к. преобразование из в void (A::*)() в void * невозможно, то ошибка, а как тогда объяснить ошибку связанную со строкой :
C++
1
2
3
  
      //int *p= &a_obj.a; - не работает
        //int *p= &A::a; - не работает
в Т.А. Павловская "C/C++ прог. на яз. высокого уровня" пишут, что указатель на элемент класса в отличии от указателя на обычную переменную или функцию, ссылается не на определенный адрес памяти, а больше похож на индекс в массиве, т.к. задает смещение

Вот не могли бы вы поподробней рассказать про то что из себя этот указатель представляет,а то не очень понятно... и есть что-то, что позволяет достать адрес элемента класса, начинается по-моему на __co...и как-то связанно с __thiscall

И вообще для чего нужны эти указатели, что на методы класса, что на обычные функции?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2012, 18:57
Ответы с готовыми решениями:

Указатели и элементы класса
Суть проблемы: есть класс neuro. в нём есть элемент данных double *inputs; // входыесть...

Указатели на метод класса
Допустим есть 2 класса: class A { public: A() {} ~A() {} virtual void...

Указатели на объекты класса
Здравствуйте. помогите новичку. есть проблема с освоением программирования на VC++. пытаюсь...

Указатели на члены класса
Здравствуйте, В коде при вызове функции print() из CL2 вызывается print() из CL1. Подскажите,...

22
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
11.09.2012, 19:14 2
Указатель на поле класса/структуры Foo это не *, а Foo::*.
Чтобы получить значение по этому указателю, помимо него самого нужен еще указатель на экземпляр объекта Foo.
Указатели на функции нужны для более гибкого, настраиваемого поведения. Например сортировка, передал указатель на один предикат - отсортировал по возрастанию, другой - по убыванию, и так далее.
Так указатели на функции нужны для обратных вызовов.
В общем, применений много.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 19:27  [ТС] 3
Цитата Сообщение от Герц Посмотреть сообщение
Например сортировка, передал указатель на один предикат - отсортировал по возрастанию, другой - по убыванию, и так далее.
Ну для этого же я могу передавать не указатель на функцию, а саму функцию...

можете какой-нибудь простенький пример-код привести, где невозможно обойтись без указателя на функцию/метод?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.09.2012, 19:37 4
Alberto_Timakov,
а саму функцию
Простите, что? Это как же вы саму функцию передадите в другую функцию как параметр?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
11.09.2012, 19:44 5
Ну для этого же я могу передавать не указатель на функцию, а саму функцию...
Как это, как это?

Пример 1: создание окна средствами WinAPI
C++
1
2
3
4
5
6
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
// ...
 
WNDCLASSEX wcex;
wcex.lpfnWndProc = WndProc;
Ты никак, при всем желании, не обойдешься без передачи указателя на функцию WndProc, если хочешь задать своему окну какое-то поведение. Система должна знать, к кому ей взывать, когда окну приходит сообщение :-)

Пример 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
#include <vector>
#include <algorithm>
#include <iostream>
 
bool predicate( int a, int b );
 
int main()
{
   std::vector< int > vec = { 1, 0, 3, -1, 10, 5, 16, 20, 2 };
   
   for ( std::vector< int >::iterator it = vec.begin(); it != vec.end(); ++it ) {
      std::cout << *it << ' ';
   }
   std::cout << std::endl;
 
   std::sort( vec.begin(), vec.end(), predicate );   
 
   for ( std::vector< int >::iterator it = vec.begin(); it != vec.end(); ++it ) {
      std::cout << *it << ' ';
   }
   std::cout << std::endl;
   
   return 0;
}
 
bool predicate( int a, int b )
{
   return a < b;
}
Простите, что? Это как же вы саму функцию передадите в другую функцию как параметр?
Хотя тут все понятно. C++ не требует наличия операции взятия адреса на функцию, то есть записи
C++
1
2
void (*funcPtr)() = func;
void (*funcPtr2)() = &func;
эквивалентны. То же относится и к вызову функции по указателю, не обязательно его разыменовывать:
C++
1
2
funcPtr();
(*funcPtr)();
так же эквивалентные записи.

P.S. Сказанное относится только к указателям на обычные функции, с указателем на метод такое не прокатит, для его вызова вообще синтаксис особый, с использованием ->*, а чтобы создать такой указатель оператор & обязателен.
1
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 21:07  [ТС] 6
Цитата Сообщение от ForEveR Посмотреть сообщение
Простите, что? Это как же вы саму функцию передадите в другую функцию как параметр?
я имел ввиду

C++
1
2
3
4
5
6
7
8
int f(int a){return a;}
 
void F(int val){return val;}
 
int main(void)
{
   F(f(1)); // Передаю функцию ^_^
}

Ну т.е. конечно глупость сморозил, т.к. передается значение, а не функция.
Цитата Сообщение от Герц Посмотреть сообщение
std::sort( vec.begin(), vec.end(), predicate );
- спасибо за пример

Добавлено через 2 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
указатель на метод больше похож на индекс в массиве, т.к. задает смещение
не мог ли кто-нибудь поподробней о том что он из себя представляет...вот эту фразу развернуть...
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
11.09.2012, 21:23 7
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
#include <iostream>
 
class Foo
{ 
public:
   void a() { std::cout << "Foo::a()" << std::endl; }
};
 
void invokeMember( Foo* foo, void( Foo::* ptr )() )
{
   (foo->*ptr)(); // Вызов метода по указателю на экземпляр класса и указателю на метод
}
 
int main()
{
   Foo foo;
 
 
   invokeMember( &foo, &Foo::a );
 
   void ( Foo::* ptr )() = &Foo::a;
   (foo.*ptr)(); // Вызов метода по указателю на экземпляре объекта
     
   return 0;
}
Указатель на метод в действительности является смещением относительно адреса начала класса. Поэтому тебе нужен экземпляр объекта (или указатель на него), к которому это смещение можно применить, чтобы найти нужный метод.
Можно посмотреть на это с другой стороны - любому методу экземпляра (то бишь нестатическому) неявно передается указатель на экземпляр (this), поэтому при отсутствии экземпляра тебе не достает одного параметра для передачи его методу.

Скобочки вокруг выражения типа (object.*memberPtr)() или (objectPtr->*memberPtr)() приходится ставить, чтобы разрешить неоднозначность в грамматике C++.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
11.09.2012, 21:25 8
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
я имел ввиду
не мог ли кто-нибудь поподробней о том что он из себя представляет...вот эту фразу развернуть...
Alberto_Timakov, это логично. Ведь экземпляр класса это по сути шаблон структуры данных. Методы не создаются заново, они существуют в единственном экземпляре с момента объявления класса (не экземпляра). Посему доступ к ним можно получить либо через класс с разрешением доступа от его имени, либо через экземпляр (но тут нужно понимать, что в экземпляре то их нет и быть не может). То есть адрес метода это смещение на код в классе. Поэтому к адресу экземпляра, он не имеет прямого отношения и для доступа к нему запускается механизм доступа к классу.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 21:29  [ТС] 9
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть адрес метода это смещение на код в классе.
Что значит смещение на код в классе?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
11.09.2012, 21:36 10
Что значит смещение на код в классе?
Я тебе пример привел на пару постов выше.
Методы не создаются заново, они существуют в единственном экземпляре с момента объявления класса (не экземпляра).
Кстати недавно разузнавал про этот вопрос, заметив возможность кода вида:
C++
1
2
Foo* foo = NULL;
foo->bar();
Оказалось, что стандарт не обязывает хранить методы в единственном экземпляре, хоть это и логично.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
11.09.2012, 21:41 11
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Что значит смещение на код в классе?
Неуклюжая конечно фраза. Я не имел ввиду что класс это место где последовательно уложены методы.
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа). Хотя в записи это может выглядеть именно так.
1
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 21:44  [ТС] 12
Герцто, что у тебя после кода, я каким то образом пропустил. Спасибо=))
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
11.09.2012, 21:48 13
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа).
Статические - несомненно, они так и называются. А вот относительно нестатических стандарт умалчивает, хоть я и не видел компилятора, создающего для каждого экземпляра свои методы.
1
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
11.09.2012, 22:46 14
Цитата Сообщение от IGPIGP Посмотреть сообщение
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа). Хотя в записи это может выглядеть именно так.
Кодовые слова: таблица виртуальных функций.
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2012, 22:56 15
~OhMyGodSoLong~, виртуальные таблицы используются только при динамическом связывании. При статическом все вычисляет компилятор во время компиляции.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
11.09.2012, 23:58 16
Кодовые слова: таблица виртуальных функций.
У класса нет таблицы виртуальных функций пока отсутствует хотя бы один метод, помеченный спецификатором virtual.
http://liveworkspace.org/code/... 255f346c27
При появлении виртуальной функции размер пустого класса возрос с 1 байта до 4, то есть как раз на размер указателя на vtable для 32-битной машины.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
12.09.2012, 00:12 17
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Кодовые слова: таблица виртуальных функций.
Наверное и невиртуальные методы могут адресоваться посредством таблицы. Для меня важно, что это функции, то есть их указатель - указатель на функцию возвращающую значение типа... и объявляющую аргументы типа..., и это не простой указатель на встроенный тип. Целая структура. Вдобавок (и главное, если речь о методе), - он связан с классом. Нестатический метод без экземпляра вызвать нельзя, поскольку без указателя на экземпляр (this) нет доступа к полям. Но сути это не меняет. Ведь this в этом случае передается, не для того, чтобы метод найти, а для того чтобы указать методу класса, к полям какого экземпляра ему обращаться.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
12.09.2012, 04:06 18
Если подумать, то для вызова невиртуального метода через указатель,
живой объект не очень то и нужен. Ведь не нужно шарится по таблице
виртуальных функция для поиска правильной функции. С указателем
на виртуальный метод совсем другое, потому что таблица виртуальных
функция находится по смещению относительно адреса объекта, для
которого этот метод зовется. Что стандарт говорит относительно
первого утверждения - хз, но студия и компилер из ссылки
делают вызов невиртуального метода имея нулевой указатель на
объект. То, что в методе this оказывается равным нулю - это
уже отдельная история. Если к полям класса не обращатся,
ничего не упадет.


http://liveworkspace.org/code/... 92b61a7bfd


Далее, вот например указатель на метод:
typedef void (Foo::*MethodPtr)();
Тут нигде не кодируется его виртуальность\невиртуальность.
Поэтому, можно прикинуть, что компиляторы реализуют
указатели на методы в виде какой-то структуры,
в которой есть флажок о виртуальности\невиртуальности метода
и другие поля, позволяющие сделать правильный вызов.
Для невиртуальных методов будет использоваться поле,
в которой указатель на метод похож на указатели на свободные
функции (с учетом того, что сигнатура несколько расширена
за счет неявной передачи this и может быть соглашения о
вызове другие). А вот в случае указателя на виртулальный
метод используются другие поля. Например просто индекс
функции в таблице виртуальных функций, ведь для вызова
виртуального метода через указатель нужен сам объект
для определения, где таблица функций и смещение на указатель
к нужному методу.

Ну примерно это можно было бы описать так:

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
typedef void (Foo::*MethodPtr)();
//примерно эквивалентно
struct MethodPtr
{
  bool isVirtual;
  void (*nonVirtPtr)(Foo*);
  int virtFunPtrOffset;
};
 
{
  MethodPtr nonVirtPtr = &Foo::NonVirtual;
  MethodPtr virtPtr = &Foo::Virtual;
 
  // после этого поля у ptr будут такими:
  //nonvirtPtr.isVirtual == false;
  //nonvirtPtr.NonVirtPtr == указатель на функцию
  //nonvirtPtr.virtFunPtrOffset == неопределено. пусть будет -1
 
  //virtPtr.isVirtual == true;
  //virtPtr.NonVirtPtr == не определено. пусть будет 0
  //virtPtr.virtFunPtrOffset == смещение в таблице. пусть будет 0 (т.е. первый метод в таблице)
 
   //далее код вызова превращается в следующее
 
   MethodPtr ptr = nonVirtPtr;
   //MethodPtr ptr = virtPtr;
 
   Foo* foo = 0;
   foo->*method)();
   if (ptr.isVirtual)
   {
      // Получение указателя на табличку. Может крашнутся,
      // а может и нет. Просто вернется указатель на хз что.
      // Ведь чтобы получить указатель на таблицу, компилятору
      // нужно знать лишь адрес объекта и сместится относительно
      // него на определенное известное во время компиляции значение.
      // нет особого смысла проверять корректность адреса объекта,
      // к нему достаточно прибавить нужное смещение. Если адрес
      // объекта будет кривой, то и адрес таблички тоже будет кривым
      // жопа случится при попытке вызвать что-то из этой таблицы.
      
      VTable vtbl = GetVTableOfObject(foo);
      // В этом месте у нас есть таблица и индекс функции в этой
      // таблице. Сигнатура метода тоже известна.
      (vtbl[ptr.virtFuncOffset])(foo);
 
      // в случае кривого указателя на таблицу вот это:
      // vtbl[ptr.virtFuncOffset] - тоже кривое.
 
   }
   else
   {
     // в этой ветке для вызова метода сам объект вроде как и не нужен.
     // метод вызовится ну а крашнется или нет уже зависит от кода 
     // самого метода. Главное что метод вызовится.
     (ptr.nonVirtPtr)(foo);
   }
}
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
12.09.2012, 04:06 19
Если подумать, то для вызова невиртуального метода через указатель,
живой объект не очень то и нужен. Ведь не нужно шарится по таблице
виртуальных функция для поиска правильной функции. С указателем
на виртуальный метод совсем другое, потому что таблица виртуальных
функция находится по смещению относительно адреса объекта, для
которого этот метод зовется. Что стандарт говорит относительно
первого утверждения - хз, но студия и компилер из ссылки
делают вызов невиртуального метода имея нулевой указатель на
объект. То, что в методе this оказывается равным нулю - это
уже отдельная история. Если к полям класса не обращатся,
ничего не упадет.


http://liveworkspace.org/code/... 92b61a7bfd


Далее, вот например указатель на метод:
typedef void (Foo::*MethodPtr)();
Тут нигде не кодируется его виртуальность\невиртуальность.
Поэтому, можно прикинуть, что компиляторы реализуют
указатели на методы в виде какой-то структуры,
в которой есть флажок о виртуальности\невиртуальности метода
и другие поля, позволяющие сделать правильный вызов.
Для невиртуальных методов будет использоваться поле,
в которой указатель на метод похож на указатели на свободные
функции (с учетом того, что сигнатура несколько расширена
за счет неявной передачи this и может быть соглашения о
вызове другие). А вот в случае указателя на виртулальный
метод используются другие поля. Например просто индекс
функции в таблице виртуальных функций, ведь для вызова
виртуального метода через указатель нужен сам объект
для определения, где таблица функций и смещение в этой
таблице чтобы получить указатель на правильную функцию.
Флажок виртуальности\невиртуальности проверяется в рантайме.

Ну примерно это можно было бы описать так:

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
typedef void (Foo::*MethodPtr)();
//примерно эквивалентно
struct MethodPtr
{
  bool isVirtual;
  void (*nonVirtPtr)(Foo*); // указатель на функцию (как бы свободную), которая возвращает void и принимает Foo*
  int virtFunPtrOffset;
};
 
{
  MethodPtr nonVirtPtr = &Foo::NonVirtual;
  MethodPtr virtPtr = &Foo::Virtual;
 
  // после этого поля у указателей будут такими:
  //nonvirtPtr.isVirtual == false;
  //nonvirtPtr.NonVirtPtr == указатель на функцию
  //nonvirtPtr.virtFunPtrOffset == неопределено. пусть будет -1
 
  //virtPtr.isVirtual == true;
  //virtPtr.NonVirtPtr == не определено. пусть будет 0
  //virtPtr.virtFunPtrOffset == смещение в таблице. пусть будет 0 (т.е. первый метод в таблице)
 
 
 
   MethodPtr methodPtr = nonVirtPtr;
   //MethodPtr methodPtr = virtPtr;
 
   Foo* foo = 0;
   (foo->*methodPtr)();
   //этот код превращается примерно в следующее
   if (methodPtr.isVirtual)
   {
      // Получение указателя на табличку. Может крашнутся,
      // а может и нет. Просто вернется указатель на хз что.
      // Ведь чтобы получить указатель на таблицу, компилятору
      // нужно знать лишь адрес объекта и сместится относительно
      // него на определенное известное во время компиляции значение.
      // нет особого смысла проверять корректность адреса объекта,
      // к нему достаточно прибавить нужное смещение. Если адрес
      // объекта будет кривой, то и адрес таблички тоже будет кривым
      // жопа случится при попытке вызвать что-то из этой таблицы.
      
      VTable vtbl = GetVTableOfObject(foo);
      // В этом месте у нас есть таблица и индекс функции в этой
      // таблице. Сигнатура метода тоже известна.
      (vtbl[methodPtr.virtFuncOffset])(foo);
 
      // в случае кривого указателя на таблицу вот это:
      // vtbl[methodPtr.virtFuncOffset] - тоже кривое.
 
   }
   else
   {
     // в этой ветке для вызова метода сам объект вроде как и не нужен.
     // метод вызовится ну а крашнется или нет уже зависит от кода 
     // самого метода. Главное что метод вызовится.
     (methodPtr.nonVirtPtr)(foo);
   }
}
Ну и возможно еще есть какие-то хитрости в преобразовании указателей на объекты в случае указателя на виртуальный метод и множественном наследовании с и без виртуальной базы (виртуальных базовых классов). Там уже нужно смотреть на компоновку объектов в памяти.
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
12.09.2012, 13:56 20
DU, я совсем не уверен в том, что сейчас скажу. Но есть надежда, что если кого-то зацепит, - получим более конкретную информацию.
С моей точки зрения объект наследующего класса, объявленный через указатель базового класса не теряет ведь, своей типовой принадлежности (конструктор же свой используется), поэтому информация о смещении, в данном случае находится в базовом классе. В экземпляре, - информация о том относительно какого класса (наследника) смещение, ну и конечно this...

Не по теме:


Вообще, для программирования на ЯП высокого уровня это скорее предположения. Да и знаний маловато. Отсюда и легенды. Вот одна из них.

pikki-wedia:
У индейцев племени Нав...ах каких охотников, есть легенда о том, что душа хахаскера честно использовавшего STL и придерживавшегося хорошего стиля, обязательно будет обласкана Великим Мани Тоо. Он поместит её в вечно зелёную виртуальную страну, где ходят тучные стада грациозных рекурсий и и мохнатых инлайнов!
Мечта. Если о рекурсиях ещё есть более менее твердые сведения, то инлайн - зверь совершенно загадочный. Но говорят если очень попросить Мани Тоо, он может материализовать инлайн! :)
Простите за оффтоп:friends:

0
12.09.2012, 13:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2012, 13:56
Помогаю со студенческими работами здесь

Конструкторы и указатели на объект класса
Добрый вечер. Помогите, пожалуйста, прояснить 2 вещи: 1) В чём будет отличие между...

ООП - Указатели на функции члены класса
Не пойму в чем ошибка, MVS2017 при компиляции выдает целую стопку ошибок: #include...

Потоки и указатели (в поток вставить объект класса)
Есть структура: class shapka{ public: int* prev; int n; int* next; } }; Нужно в поток...

Как на практике используются указатели на члены класса
Вопрос №3. А как на практике используются указатели на члены класса? Они в реальном коде вообще...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru