В C ++ я не могу понять указатели и классы - PullRequest
7 голосов
/ 18 сентября 2008

Я только что закончила колледж и работаю в C ++ уже некоторое время. Я понимаю все основы C ++ и использую их, но мне трудно осваивать более сложные темы, такие как указатели и классы. Я прочитал некоторые книги и учебные пособия, и я понимаю примеры в них, но затем, когда я смотрю на некоторые продвинутые примеры из реальной жизни, я не могу понять их. Это убивает меня, потому что я чувствую, что это мешает мне вывести мои программы на C ++ на новый уровень. У кого-нибудь еще была эта проблема? Если да, то как ты прорвался? Кто-нибудь знает какие-нибудь книги или учебные пособия, которые действительно хорошо описывают указатели и концепции классов? или, может быть, какой-нибудь пример кода с хорошими описательными комментариями с использованием продвинутых указателей и методов классов? любая помощь будет принята с благодарностью.

Ответы [ 27 ]

0 голосов
/ 19 сентября 2008

Для занятий:

Прорывом для меня стал момент, когда я узнал об интерфейсах. Идея абстрагировать детали того, как вы написали, решила проблему, и дать только список методов, взаимодействующих с классом, была очень проницательной.

На самом деле, мой профессор прямо сказал нам, что он оценит наши программы, подключив наши классы к своему тестовому устройству. Оценка будет производиться в соответствии с требованиями, которые он нам дал, и с ошибкой программы.

Короче говоря, классы позволяют вам обернуть функциональность и назвать ее более понятным способом (в большинстве случаев всегда есть исключения)

0 голосов
/ 19 сентября 2008

Думаю, для лучшего понимания указателей может быть полезно взглянуть на то, как язык ассемблера работает с указателями. Концепция указателей действительно является одной из фундаментальных частей языка ассемблера и архитектуры команд процессора x86. Возможно, это позволит вам упасть, как указатели - естественная часть программы.

Что касается классов, кроме ОО-парадигмы, я думаю, что было бы интересно взглянуть на классы с точки зрения двоичного уровня низкого уровня. Они не настолько сложны в этом отношении на базовом уровне.

Вы можете прочитать Внутри объектной модели C ++ , если хотите лучше понять, что находится под объектной моделью C ++.

0 голосов
/ 19 сентября 2008

Из ответа Лассевека на аналогичный вопрос по SO :

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

Я обнаружил, что лучшая аналогия рассматривать указатель как кусок бумага с домашним адресом и блок памяти, на который он ссылается как фактический дом. Все виды операций можно легко объяснить:

  • Скопировать значение указателя, просто написать адрес на новом листе бумаги
  • Связанные списки, бумажка в доме с адресом следующего дом на нем
  • Освободив память, снесите дом и сотрите адрес
  • Утечка памяти, вы теряете лист бумаги и не можете найти дом
  • Освободив память, но сохранив (теперь недействительную) ссылку, уничтожьте дом, сотри один из кусочков бумага, но есть еще один лист бумаги со старым адресом на нем, когда вы перейдите по адресу, вы не найдете дом, но вы можете найти что-то что напоминает руины одного
  • Переполнение буфера, вы перемещаете больше вещей в дом, чем можете возможно, подходит, проливая в соседский дом
0 голосов
/ 22 сентября 2008

Кажется, ваша проблема в ядре C в C ++, а не в самом C ++. Получите себе Kernighan & Ritchie ( Язык программирования C ). Вдохни это. Это очень хороший материал, одна из лучших когда-либо написанных книг по языку программирования.

0 голосов
/ 19 сентября 2008

В момент, когда я действительно получил указатели, было написано TurboPascal на FatMac (примерно в 1984 году), который в то время был родным языком Mac.

У Mac была странная модель памяти, при которой при выделении адреса память сохранялась в указателе на куче, но местоположение самого этого не гарантировалось, и вместо этого процедуры обработки памяти возвращали указатель на указатель - ссылается на в качестве ручки. Следовательно, чтобы получить доступ к любой части выделенной памяти, необходимо дважды разыменовать дескриптор. Это заняло некоторое время, но постоянная практика в конечном итоге привела к уроку домой.

Обработка указателей в Pascal легче понять, чем в C ++, где синтаксис не помогает новичку. Если вы по-настоящему застряли в понимании указателей на C, то лучшим вариантом может быть получение копии компилятора Pascal и попытка написать в нем некоторый базовый код указателя (Pascal достаточно близок к C, и вы получите основы через несколько часов ). Связанные списки и тому подобное были бы хорошим выбором. Как только вы освоитесь с возвращением в C ++ и освоите концепции, вы обнаружите, что скала не будет выглядеть такой крутой.

0 голосов
/ 19 сентября 2008

Притворяться, что указатель является адресом массива.

x = 500; // memory address for hello;
MEMORY[x] = "hello"; 
print  MEMORY[x]; 

это графическое упрощение, но по большей части, если вы никогда не хотите знать, что это за число или задаете его вручную, у вас все будет хорошо.

Когда я понял C, у меня было несколько макросов, которые более или менее позволяли вам использовать указатели точно так же, как они были индексом массива в памяти. Но я давно потерял этот код и давно забыл.

Я помню, это началось с

#define MEMORY 0; 
#define MEMORYADDRESS( a ) *a;

и это само по себе вряд ли полезно. Надеюсь, кто-то еще сможет расширить эту логику.

0 голосов
/ 19 сентября 2008

Книга, которая взломала мне указатели, была Иллюстрирующая Анси C Дональда Алкока. Он полон рисованных рамок и диаграмм со стрелками, которые иллюстрируют указатели, арифметику указателей, массивы, строковые функции и т. Д. *

Очевидно, что это книга 'C', но по основным принципам ее трудно превзойти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...