Итак, у меня есть структура, которую я создаю, которую я также могу создать класс, но когда я пытаюсь получить их свойства … она дает мне случайные буквы. Как совершенно случайно. Я вижу такие вещи, как «(▌ ¶∞ ♥! ¶ ↑ ♥! ¶≤ ≈ ¶⌠ ☻! ¶≈ Ç┌ ¶√ Φ`◄¶ ◄▬¶Ç┌ ¶√ Ç☻V ♫ √ ╨┘ ¶⌠ ¶⌠ ¶⌠ 0│ «.
Я сократил это до чего-то совершенно базового, и я до сих пор не понимаю, почему он это делает.
struct Example
{
const char* Whatever = "Hello";
};
И когда я делаю это
Example* exampleObj;
print(exampleObj->Whatever);
Это поднимает случайные буквы. Случайные буквы варьируются от исполнения к выполнению программы.
Указатель — это переменная, которая содержит адрес в памяти, где находится объект. Поэтому объявления указателя недостаточно, вам также нужно создать что-то, на что он будет указывать. Это означает, что вам нужно выделить немного памяти, в которую вы можете поместить свой объект.
Example* exampleObj; // at the moment exampleObj contains spurious data
Это просто указатель. Но вы не создали ничего, на что можно было бы указать. Если вы попытаетесь получить к нему доступ, вы получите ложный мусор!
Таким образом, чтобы выделить кусок памяти, содержащий действительный объект, вам нужно использовать new
как это:
Example* exampleObj = new Example; // new returns a chunk of valid memory
Теперь указателю назначен правильный адрес памяти, который содержит объект, который вы только что создали, используя new
,
НОТА:
Часто нет необходимости выделять ваши объекты вручную, используя new
, Вместо этого вы можете использовать automatic
переменная, а не указатель:
Example exampleObj; // note no * means its not a pointer but a whole object
РЕШЕНИЕ:
Таким образом, у нас есть 2 способа решить вашу проблему. Создать new
объект и назначить его адрес указателю или создать automatic
объект:
// Solution 1:
Example* exampleObj = new Example; // Must remember to delete (smart pointer?)
print(exampleObj->Whatever);
// Solution 2 (usually MUCH better)
Example exampleObj;
print(exampleObj.Whatever); // note: uses . rather than ->