Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 18:57     указатели на элементы класса #1
Здравствуйте!
есть код:

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

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

можете какой-нибудь простенький пример-код привести, где невозможно обойтись без указателя на функцию/метод?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.09.2012, 19:37     указатели на элементы класса #4
Alberto_Timakov,
а саму функцию
Простите, что? Это как же вы саму функцию передадите в другую функцию как параметр?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 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. Сказанное относится только к указателям на обычные функции, с указателем на метод такое не прокатит, для его вызова вообще синтаксис особый, с использованием ->*, а чтобы создать такой указатель оператор & обязателен.
Alberto_Timakov
1 / 1 / 0
Регистрация: 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 Посмотреть сообщение
указатель на метод больше похож на индекс в массиве, т.к. задает смещение
не мог ли кто-нибудь поподробней о том что он из себя представляет...вот эту фразу развернуть...
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 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++.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
11.09.2012, 21:25     указатели на элементы класса #8
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
я имел ввиду
не мог ли кто-нибудь поподробней о том что он из себя представляет...вот эту фразу развернуть...
Alberto_Timakov, это логично. Ведь экземпляр класса это по сути шаблон структуры данных. Методы не создаются заново, они существуют в единственном экземпляре с момента объявления класса (не экземпляра). Посему доступ к ним можно получить либо через класс с разрешением доступа от его имени, либо через экземпляр (но тут нужно понимать, что в экземпляре то их нет и быть не может). То есть адрес метода это смещение на код в классе. Поэтому к адресу экземпляра, он не имеет прямого отношения и для доступа к нему запускается механизм доступа к классу.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 21:29  [ТС]     указатели на элементы класса #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть адрес метода это смещение на код в классе.
Что значит смещение на код в классе?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 21:36     указатели на элементы класса #10
Что значит смещение на код в классе?
Я тебе пример привел на пару постов выше.
Методы не создаются заново, они существуют в единственном экземпляре с момента объявления класса (не экземпляра).
Кстати недавно разузнавал про этот вопрос, заметив возможность кода вида:
C++
1
2
Foo* foo = NULL;
foo->bar();
Оказалось, что стандарт не обязывает хранить методы в единственном экземпляре, хоть это и логично.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
11.09.2012, 21:41     указатели на элементы класса #11
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Что значит смещение на код в классе?
Неуклюжая конечно фраза. Я не имел ввиду что класс это место где последовательно уложены методы.
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа). Хотя в записи это может выглядеть именно так.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
11.09.2012, 21:44  [ТС]     указатели на элементы класса #12
Герцто, что у тебя после кода, я каким то образом пропустил. Спасибо=))
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 21:48     указатели на элементы класса #13
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа).
Статические - несомненно, они так и называются. А вот относительно нестатических стандарт умалчивает, хоть я и не видел компилятора, создающего для каждого экземпляра свои методы.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
11.09.2012, 22:46     указатели на элементы класса #14
Цитата Сообщение от IGPIGP Посмотреть сообщение
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа). Хотя в записи это может выглядеть именно так.
Кодовые слова: таблица виртуальных функций.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.09.2012, 22:56     указатели на элементы класса #15
~OhMyGodSoLong~, виртуальные таблицы используются только при динамическом связывании. При статическом все вычисляет компилятор во время компиляции.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 23:58     указатели на элементы класса #16
Кодовые слова: таблица виртуальных функций.
У класса нет таблицы виртуальных функций пока отсутствует хотя бы один метод, помеченный спецификатором virtual.
http://liveworkspace.org/code/c7d21d...7e53255f346c27
При появлении виртуальной функции размер пустого класса возрос с 1 байта до 4, то есть как раз на размер указателя на vtable для 32-битной машины.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
12.09.2012, 00:12     указатели на элементы класса #17
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Кодовые слова: таблица виртуальных функций.
Наверное и невиртуальные методы могут адресоваться посредством таблицы. Для меня важно, что это функции, то есть их указатель - указатель на функцию возвращающую значение типа... и объявляющую аргументы типа..., и это не простой указатель на встроенный тип. Целая структура. Вдобавок (и главное, если речь о методе), - он связан с классом. Нестатический метод без экземпляра вызвать нельзя, поскольку без указателя на экземпляр (this) нет доступа к полям. Но сути это не меняет. Ведь this в этом случае передается, не для того, чтобы метод найти, а для того чтобы указать методу класса, к полям какого экземпляра ему обращаться.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.09.2012, 04:06     указатели на элементы класса #18
Если подумать, то для вызова невиртуального метода через указатель,
живой объект не очень то и нужен. Ведь не нужно шарится по таблице
виртуальных функция для поиска правильной функции. С указателем
на виртуальный метод совсем другое, потому что таблица виртуальных
функция находится по смещению относительно адреса объекта, для
которого этот метод зовется. Что стандарт говорит относительно
первого утверждения - хз, но студия и компилер из ссылки
делают вызов невиртуального метода имея нулевой указатель на
объект. То, что в методе this оказывается равным нулю - это
уже отдельная история. Если к полям класса не обращатся,
ничего не упадет.


http://liveworkspace.org/code/036ec3...7b4592b61a7bfd


Далее, вот например указатель на метод:
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);
   }
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.09.2012, 04:06     указатели на элементы класса #19
Если подумать, то для вызова невиртуального метода через указатель,
живой объект не очень то и нужен. Ведь не нужно шарится по таблице
виртуальных функция для поиска правильной функции. С указателем
на виртуальный метод совсем другое, потому что таблица виртуальных
функция находится по смещению относительно адреса объекта, для
которого этот метод зовется. Что стандарт говорит относительно
первого утверждения - хз, но студия и компилер из ссылки
делают вызов невиртуального метода имея нулевой указатель на
объект. То, что в методе this оказывается равным нулю - это
уже отдельная история. Если к полям класса не обращатся,
ничего не упадет.


http://liveworkspace.org/code/036ec3...7b4592b61a7bfd


Далее, вот например указатель на метод:
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);
   }
}
Ну и возможно еще есть какие-то хитрости в преобразовании указателей на объекты в случае указателя на виртуальный метод и множественном наследовании с и без виртуальной базы (виртуальных базовых классов). Там уже нужно смотреть на компоновку объектов в памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 13:56     указатели на элементы класса
Еще ссылки по теме:

Не вводятся элементы в массив(указатели) C++
C++ Просуммировать элементы массива используя указатели
Указатели на члены класса C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
12.09.2012, 13:56     указатели на элементы класса #20
DU, я совсем не уверен в том, что сейчас скажу. Но есть надежда, что если кого-то зацепит, - получим более конкретную информацию.
С моей точки зрения объект наследующего класса, объявленный через указатель базового класса не теряет ведь, своей типовой принадлежности (конструктор же свой используется), поэтому информация о смещении, в данном случае находится в базовом классе. В экземпляре, - информация о том относительно какого класса (наследника) смещение, ну и конечно this...

Не по теме:


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

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

Yandex
Объявления
12.09.2012, 13:56     указатели на элементы класса
Ответ Создать тему
Опции темы

Текущее время: 11:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru