В C ++ вы можете иметь указатель на функцию, вы также можете иметь указатель на класс? - PullRequest
7 голосов
/ 13 ноября 2008

Я не говорю об указателе на экземпляр, я хочу указатель на сам класс.

Ответы [ 9 ]

17 голосов
/ 13 ноября 2008

В C ++ классы не являются " объектами первого класса ". Самое близкое, что вы можете получить, это указатель на его экземпляр type_info.

5 голосов
/ 13 ноября 2008

Нет. Указатель - это адрес чего-либо в памяти компьютера во время выполнения. Класс - это просто набор инструкций для компилятора.

4 голосов
/ 13 ноября 2008

Как уже сказали все остальные, невозможно иметь указатель на класс.

Но если цель заключается в создании нового экземпляра из некоторого класса, выбранного во время выполнения, вы можете проверить шаблоны проектирования Factory Method (или Abstract Factory).

1 голос
/ 13 ноября 2008

Вы не можете иметь (во время выполнения) указатель на класс, но C ++ имеет похожую концепцию времени компиляции: параметры шаблона . Boost имеет библиотеку , предназначенную для управления ими, и библиотеку traits для получения информации о классах.

1 голос
/ 13 ноября 2008

А "Класс" не существует. Единственное, на что вы можете указать, это данные.

Остальная часть «Класса» на самом деле является таблицей отправки. Для каждого метода в классе в таблице диспетчеризации есть указатель. Таким образом, класс указывает на правильный метод вашего класса независимо от того, к какому типу он в настоящее время приведен. Это было бы бесполезно для доступа.

Методы в вашем классе (вещи, на которые указывает таблица диспетчеризации) на самом деле являются просто «функциями», которые передаются в указателе данных вашего класса. Определение метода в значительной степени состоит в том, что это функция, которая принимает данные классов в качестве параметра. В большинстве языков стиля C этот указатель данных скрыт, но называется «this».

Методы для вашего класса могут распространяться по всей базе кода. Из-за родительских классов вы вряд ли найдете эти методы рядом друг с другом.

1 голос
/ 13 ноября 2008

В отличие от настоящих объектно-ориентированных языков, класс не является объектом в C ++, более жаль. Ближайший «указатель на класс» - RTTI:

const std :: type_info & info = typeid (выражение объекта);

type_info имеет поиск членов name (), и их можно сравнивать друг с другом.

1 голос
/ 13 ноября 2008

Да и нет. Это зависит от вашего контекста того, чего вы пытаетесь достичь. Если вы просто хотите указатель на тип , то нет, там нет пути. тип не живет в памяти в смысле указателя.

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

0 голосов
/ 13 ноября 2008

Да, встроенная в C ++ поддержка отражения / самоанализа не поддерживается, но есть ряд библиотек, которые добавят многие функции, например, класса Java, и позволят программисту получить объект, представляющий класс, создать экземпляр и т. д. Google C ++ отражение.

0 голосов
/ 13 ноября 2008

В зависимости от того, как вы хотите думать об указателях, вы можете иметь «указатель» на класс, если под указателем вы подразумеваете какое-то целое значение. Boost позволяет вам регистрировать типы и назначать уникальное целое число для каждого типа, который вы регистрируете. Если все типы, которые вы регистрируете, являются классами, то во время выполнения вы можете найти код, необходимый для создания объекта нужного вам типа, если у вас есть значение нужного вам типа. Но в целом классы не являются первоклассными объектами в языке, и лучшее, на что вы можете надеяться, это смоделировать поведение, которое вы хотите иметь.

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