Указатель на класс C ++ - PullRequest
       42

Указатель на класс C ++

1 голос
/ 30 марта 2012

Я просто хотел узнать, могу ли я указать на класс с помощью этой реализации:

class hello
{
    public:
         void blah();
};

typedef hello* pointer_to_class_hello;

pointer_to_class _hello p1;

Итак, теперь этот новый указатель p1 указывает на класс "привет"?

Ответы [ 5 ]

2 голосов
/ 30 марта 2012
class hello
{
    public:
         void blah();
};

typedef hello* pointer_to_class_hello;

pointer_to_class_hello p1;

Указывает ли этот новый указатель p1 на класс "привет"?Нет, указатели в C ++ указывают на объекты (класс является типом), будь то с автоматической, статической или динамической продолжительностью хранения (или на функции).Кроме того, p1 неинициализирован, поэтому он еще не указывает ни на одно действительное местоположение.

hello H;
p1 = &H;  // Now it does, it points to H.
1 голос
/ 30 марта 2012

Во-первых, вы должны понять разницу между классом и экземпляром, или объектом. Объект является переменной, а класс является его типом.

Таким образом, указатель не может указывать на класс. Это может указывать только на объект. Более конкретно, указатель - это адрес ячейки памяти, в которой хранится объект.

Однако вы часто слышите «указатель на класс А». Это относится к типу указателя. Например, если вы видите int *a, вы можете сказать «a - указатель на целое число», что означает, что это тип переменной a. Однако a не указывает на тип int, он указывает на конкретное целое число.

Аналогичным образом p1 в вашем примере имеет тип "указатель на класс hello". Однако он может указывать только на объект class hello, поскольку нет смысла указывать на класс.

Обратите внимание на одну важную вещь. Как вы объявили, p1 не инициализируется. Это не означает, что он равен NULL или что он указывает «никуда». Это означает, что это указывает на некоторую произвольную область памяти. Если вы попытаетесь использовать его, поведение программы непредсказуемо. Если вам повезет, вы получите ошибку сегментации, означающую, что ваша программа потерпит крах. Как правило, когда вы объявляете указатель, вы должны как можно скорее указать на него. У вас может быть что-то вроде этого:

// make p1 point to a dynamically allocated object
pointer_to_class _hello p1 = new hello;

или

// make p1 point to a local variable
hello objectOfClassHello;
pointer_to_class _hello p1 = &objectOfClassHello;
1 голос
/ 30 марта 2012

Класс hello - это тип .

pointer_to_class_hello - это тип , который является синонимом hello* (тип указателя на экземпляр типа hello):

typedef hello* pointer_to_class_hello;

p1 объявляется переменной of type pointer_to_class_hello:

pointer_to_class_hello p1; // note extra space removed in type of p1

На данный момент p1 ни на что не указывает, на самом деле его значение, скорее всего, "мусор" (воспринимайте его какслучайный номер).Вам необходимо присвоить ему действительное значение , прежде чем вы сможете его использовать.Для этого вам необходим экземпляр (также называемый объект ) класса hello, например:

hello h;

Затем вы можете назначить адрес этого экземпляра до p1:

p1 = &h; // & returns the address where h resides in memory

В качестве альтернативы, вы также можете выполнить назначение в точке объявления:

pointer_to_class_hello p1 = &h;

Затем вы можете использовать указатель для доступа к объекту, на который указывают:

p1->blah(); // at this point this is same as h.blah();
0 голосов
/ 30 марта 2012

Должно быть так:

pointer_to_class_hello p1;

У вас есть дополнительное место по неизвестной причине.

0 голосов
/ 30 марта 2012

Вы не можете иметь указатель на класс;только указатель на адрес объекта или функции.

hello myHello;                        // Declare a variable of type class hello
pointer_to_class_hello p1 = &myHello; // Point to the address of the variable
...