Как узнать класс объекта с
Перейти к содержимому

Как узнать класс объекта с

  • автор:

Определение класса в языке C++ и создание его объекта

Класс — это производный структурированный тип, введенный программистом на основе уже существующих типов. Другими словами, механизм классов задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными.

Общий синтаксис класса можно определить с помощью конструкции:

class имя_класса { список_компонентов };

имя_класса — произвольно выбираемый идентификатор

список_компонентов — определения и описания типизированных данных и принадлежащих классу функций. Компонентами класса могут быть данные, функции, классы, перечисления, битовые поля и имена типов. Вначале для простоты будем считать, что компоненты класса — это типизированные данные (базовые и производные) и функции.

Заключенный в фигурные скобки список компонентов называют телом класса.
Телу класса предшествует заголовок. В простейшем случае заголовок класса включает слово class и имя.
Определение класса всегда заканчивается точкой с запятой.

Итак, принадлежащие классу функции мы будем называть методами класса или компонентными функциями. Данные класса — компонентными данными или элементами данных класса.

Вернемся к определению: класс — это тип, введенный программистом. А, так как, каждый тип служит для определения объектов, определим синтаксис создания объекта класса.

имя_класса имя_объекта;

Определение объекта класса предусматривает выделение участка памяти и деление этого участка на фрагменты, соответствующие отдельным элементам объекта.

Способы доступа к компонентам класса.

Существует несколько уровней доступа к компонентам класса. Рассмотрим основные:

public — члены класса открыты для доступа извне.
private — члены класса закрыты для доступа извне.

По умолчанию все переменные и функции, принадлежащие классу, определены как закрытые (private). Это означает, что они могут использоваться только внутри функций-членов самого класса. Для других частей программы, таких как функция main(), доступ к закрытым членам запрещен. Это, кстати, единственное отличие класса от структуры — в структуре все члены по умолчанию — public.

С использованием спецификатора доступа public можно создать открытый член класса, доступный для использования всеми функциями программы (как внутри класса, так и за его пределами).

class имя_класса { закрытые переменный и функции; защищенные члены данных; защищенные конструкторы; защищенные методы; public: открытые переменные и функции; общедоступные свойства; общедоступные члены данных; общедоступные конструкторы; общедоступный деструктор; общедоступные методы; } список имен объектов;

Синтаксис для доступа к данным конкретного объекта заданного класса (как и в случае структур), таков:

имя_объекта.имя_члена класса;

Пришло время примера…

# include using namespace std; class Test{ // так как спецификатор доступа не указан // данная переменная будет по умолчанию закрыта // для доступа вне класса (private) int one; // спецификатор доступа public // все члены, идущие после него // будут открыты для доступа извне public: // инициализировать переменные в классе // при создании запрещено, поэтому мы определяем // метод, реализующий данное действие void Initial(int o,int t){ one=o; two=t; } // метод показывающий переменные класса // на экран void Show(){ cout"\n\n"one"\t"two"\n\n"; } int two; }; void main(){ // создается объект с типом Test Test obj; // вызывается функция, инициализирующая его свойства obj.Initial(2,5); // показ на экран obj.Show(); // 2 5 // прямая запись в открытую переменную two // с переменной one такая запись невозможна, так // как доступ к ней закрыт obj.two=45; // снова показ на экран obj.Show(); // 2 45 }

Вышеописанный пример вполне интуитивно прост, однако, выделим один из главных моментов — переменные класса нет необходимости передавать в методы класса в качестве параметров, так как они видны в них автоматически.

Оператор .

Внутри класса функции-члены могут вызывать друг друга и обращаться к к переменным членам, не используя оператор точка(.) Этот оператор необходим, лишь когда обращение к функциям и переменным-членам осуществляется извне класса.

Оператор ->

Указатели на объекты. Доступ к членам объекта можно осуществлять и через указатель на объект. В этом случае применяется операция стрелка (→).

Оператор ::

Оператор :: называется оператором разрешения области видимости (scope resolution operator). Т.е. создается шаблон класса и в нем шаблоны методов класса, а сами методы описываются вне описания класса.

class stack { int stck[SIZE]; int tos; public: void init(); void push(int i); int pop(); }; void stack::init() { tos = 0; } void stack::push(int i) { if(tos==SIZE) { cout  "Stack is full.\n"; return; } stck[tos] = i; tos++; }

Константный метод объекта

Говорят, что метод объекта обладает свойством неизменности (константности), если после его выполнения состояние объекта не изменяется.Если не контролировать свойство неизменности, то его обеспечение будет целиком зависеть от квалификации программиста. Если же «неизменный» метод в процессе выполнения будет производить посторонние эффекты, то результат может быть самым неожиданным,отлаживать и поддерживать такой код очень тяжело.

Язык С++ позволяет пометить метод как константный. При этом неконстантные методы объекта запрещается использовать в теле помеченного метода, и в контексте этого метода ссылки на сам объект и все его поля будут константны. Для обозначения константности, используется модификатор const.

Также существует возможность пометить ссылку (или указатель) как константную. Применительно к ссылке свойство константности означает, что через эту ссылку можно вызывать только константные методы. Присвоение константной ссылки неконстантной запрещено.

Давайте, рассмотрим пример класса с константными методами:

# include # include using namespace std; class Personal { public: // конструктор с параметрами // мы выделяем здесь память // однако в нашем примере нет // ни деструктора, ни конструктора // копирования - единственная цель, // которую мы преследуем показать // работу константного метода Personal(char*p,char*n,int a){ name=new char[strlen(n)+1]; if(!name){ cout"Error. "; exit(0); } picture_data=new char[strlen(n)+1]; if(!picture_data){ cout"Error. "; exit(0); } strcpy(picture_data,p); strcpy(name,n); age=a; } // Группа константных методов // внутри них невозможно // изменить какое-то из свойств const char*Name()const{ return name; } int Age()const{ return age; } const char*Picture()const{ return picture_data; } void SetName(const char*n){ strcpy(name,n); } void SetAge(int a){ age=a; } void SetPicture(const char*p){ strcpy(picture_data,p); } private: char*picture_data; // путь к фотографии char*name; // имя int age; // возраст }; void main(){ Personal A("C:\\Image\\","Ivan",23); cout"Name: "A.Name()"\n\n"; cout"Age: "A.Age()"\n\n"; cout"Path for picture: "A.Picture()"\n\n"; A.SetPicture("C:\\Test\\"); A.SetName("Leonid"); A.SetAge(90); cout"Name: "A.Name()"\n\n"; cout"Age: "A.Age()"\n\n"; cout"Path for picture: "A.Picture()"\n\n"; }

В данном примере методы Name, Age, Picture объявлены константными. Кроме того, можно наблюдать и использование константных указателей: параметр методов SetName и SetPicture, возвращаемое значение методов Name и Picture. Компилятор обеспечит проверку того, что реализация константных методов не имеет побочных эффектов в виде изменения состояния объекта, реализующего класс Personal. Как только обнаружится попытка выполнить запрещенную операцию, компилятор сообщит об ошибке.

Как определить к какому классу принадлежит переданный объект ?

Author24 — интернет-сервис помощи студентам

например есть классы и метод передающий класс, который наследовался от другого класса. Как узнать какой класс передали ?

Может по коду будет понятней.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
class body { int value; } class a : public body { int x; } class b : public body { int x; } void func(){ a *foo = new a(); myMethod(foo); } void myMethod(body *obj){ // как тут узнать какой класс в obj ? a или b ? }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Узнать к какому классу принадлежит объект
class Base< >; class Child1:public Base< >; class Child2:public Base< >; class.

В некоторый момент программы нужно узнать, к какому классу принадлежит объект
В некоторый момент программы мне нужно узнать, к какому классу принадлежит объект. Вот допустим, у.

Как из общего списка получить элементы одного класса? или как определить к какому классу принадлежит объект?
суть вопроса: Есть матрица. в ней хранятся ссылки на элементы класса и его наследников (в этом.

Какому классу принадлежит метод BeginInvoke()
На первый взгляд вопрос может показаться банальным, но вот в чем дело. Создаем любой делегат (какие.

Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
по typeid .
но это, обычно, не требуется.
иначе зачем полиморфизм применять?
Регистрация: 11.06.2011
Сообщений: 387

typeid выдает базовый класс.

чтобы в зависимости от класса вызывать дополнительные методы, которых нет в базовом.

Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1

ЦитатаСообщение от admsasha Посмотреть сообщение

typeid выдает базовый класс.
как проверяете?
у меня всё работает.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include #include struct Base { virtual ~Base() {} }; struct Der1 : public Base {}; struct Der2 : public Base {}; void foo(Base * obj) { std::cout  std::boolalpha  (typeid(*obj) == typeid(Der1)); } int main() { Base * obj = new Der1; foo(obj); }

Регистрация: 11.06.2011
Сообщений: 387
std::cout << typeid(obj).name() Любитель чаепитий 3741 / 1798 / 565 Регистрация: 24.08.2014 Сообщений: 6,016 Записей в блоге: 1

ЦитатаСообщение от admsasha Посмотреть сообщение

std::cout << typeid(obj).name()

1. это выдаёт не базовый класс, а указатель на базовый класс, чем он и является.
2. разыменуйте указатель при передаче в оператор typeid , чтобы тип нормально определялся.

Регистрация: 11.06.2011
Сообщений: 387

ЦитатаСообщение от GbaLog- Посмотреть сообщение

2. разыменуйте указатель при передаче в оператор typeid, чтобы тип нормально определялся.
Так в том то и проблема. А во что ? В класс a или в класс b ?
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1

ЦитатаСообщение от admsasha Посмотреть сообщение

А во что ? В класс a или в класс b ?

в смысле «во что»?
вы знаете, что такое разыменование указателя?
https://ru.wikipedia.org/wiki/. 0.BC.D0.B8

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

смотрите, как в данном мною примере(#4) сравнивается.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Какому классу по Хомскому принадлежит грамматика?
Люди помогите Какому классу по Хомскому принадлежит грамматика c правилами S → AS|ε; A → a|b?

Какому классу по Хомскому принадлежит грамматика?
Люди помогите Какому классу по Хомскому принадлежит грамматика из правилами S → AS|ε; A → a|b?

WPF: узнать к какому классу принадлежит тот или иной элемент управления
Решил попробовать WPF после Windows Forms. Подскажите, если кто знает — как под WPF узнать к какому.

Как определить, к какому классу относится элемент массива?
Добрый вечер. Задача следующая: существует абстрактный класс, который наследуется в нескольких.

К какому элементу листа классов принадлежит объект?
Вот есть примерно такой код. Как в событии нажатия клавиши определить к какому элементу листа.

Как определить какому элементу принадлежит общее контекстное меню?
Всем здравствуйте. На форме есть два однотипных элемента (например Button1 и Button2). Каждому.

Или воспользуйтесь поиском по форуму:

Как узнать класс объекта java

Чтобы узнать класс объекта в Java, можно использовать метод getClass() :

Object obj = new String("Hello, World!"); Class cls = obj.getClass(); System.out.println("Class of obj: " + cls.getName()); 

В этом примере мы создаем объект String , затем вызываем метод getClass() , чтобы получить класс этого объекта, и, наконец, используем метод getName() , чтобы получить имя класса. Результатом будет:

Class of obj: java.lang.String 

Метод getClass() возвращает объект типа Class , который содержит информацию о классе объекта. Мы можем использовать этот объект для получения информации о классе, такой как имя, модификаторы доступа, поля, методы и т.д.

Классы, структуры и пространства имен

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

Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.

В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.

По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :

class название_класса < // содержимое класса >

После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:

class Person

Классы и объекты в языке программирования C# и .NET

Начиная с версии C# 12, если класс имеет пустое определение, то фигурные скобки после названия типа можно не использовать:

class Person;

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

Поля и методы класса

Класс может хранить некоторые данные. Для хранения данных в классе применяются поля . По сути поля класса — это переменные, определенные на уровне класса.

Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.

Итак, добавим в класс Person поля и методы:

class Person < public string name = "Undefined"; // имя public int age; // возраст public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

В данном случае в классе Person определено поле name , которое хранит имя, и поле age , которое хранит возраст человека. В отличие от переменных, определенных в методах, поля класса могут иметь модификаторы, которые указываются перед полем. Так, в данном случае, чтобы все поля были доступны вне класса Person поля определены с модификатором public .

При определении полей мы можем присвоить им некоторые значения, как в примере выше в случае переменной name . Если поля класса не инициализированы, то они получают значения по умолчанию. Для переменных числовых типов это число 0.

Также в классе Person определен метод Print() . Методы класса имеют доступ к его поля, и в данном случае обращаемся к полям класса name и age для вывода их значения на консоль. И чтобы этот метод был виден вне класса, он также определен с модификатором public .

Создание объекта класса

После определения класса мы можем создавать его объекты. Для создания объекта применяются конструкторы . По сути конструкторы представляют специальные методы, которые называются так же как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта. Общий синтаксис вызова конструктора:

new конструктор_класса(параметры_конструктора);

Сначала идет оператор new , который выделяет память для объекта, а после него идет вызов конструктора .

Конструктор по умолчанию

Если в классе не определено ни одного конструктора (как в случае с нашим классом Person), то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.

Теперь создадим объект класса Person:

Person tom = new Person(); // создание объекта класса Person // определение класса Person class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

создание классов в языке программирования C# и .NET

Для создания объекта Person используется выражение new Person() . В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект, и через эту переменную мы можем использовать данный объект и обращаться к его функциональности.

Обращение к функциональности класса

Для обращения к функциональности класса — полям, методам (а также другим элементам класса) применяется точечная нотация точки — после объекта класса ставится точка, а затем элемент класса:

объект.поле_класса объект.метод_класса(параметры_метода)

Например, обратимся к полям и методам объекта Person:

Person tom = new Person(); // создание объекта класса Person // Получаем значение полей в переменные string personName = tom.name; int personAge = tom.age; Console.WriteLine($"Имя: Возраст "); // Имя: Undefined Возраст: 0 // устанавливаем новые значения полей tom.name = "Tom"; tom.age = 37; // обращаемся к методу Print tom.Print(); // Имя: Tom Возраст: 37 class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

Консольный вывод данной программы:

Имя: Undefined Возраст: 0 Имя: Tom Возраст: 37

Добавление класса

Обычно классы помещаются в отдельные файлы. Нередко для одного класса предназначен один файл. Если мы работаем над проектом вне среды Visual Studio, используя .NET CLI, то нам достаточно добавить новый файл класса в папку проекта. Например, добавим новый файл, который назовем Person.cs и в котором определим следующий код:

class Person < public string name = "Undefined"; public void Print() < Console.WriteLine($"Person "); > >

Здесь определен класс Person с одним полем name и методом Print.

В файле Program.cs , который представляет основной файл программы используем класс Person:

Person tom = new Person(); tom.name = "Tom"; tom.Print(); // Person Tom

Использование классов в проекте в Visual Studio в языке программирования C#

Visual Studio предоставляет по умолчанию встроенные шаблоны для добвления класса. Для добавления класса нажмем в Visual Studio правой кнопкой мыши на название проекта:

Добавление класса в Visual Studio в C#

В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )

В открывшемся окне добавления нового элемента убедимся, что в центральной части с шаблонами элементов у нас выбран пункт Class . А внизу окна в поле Name введем название добавляемого класса — пусть он будет назваться Person :

Добавление нового класса в Visual Studio в C#

В качестве названия класса можно вводить как Person, так и Person.cs. И после нажатия на кнопку добавления в проект будет добавлен новый класс, в котором можно определить тот же код и также использовать в файле Program.cs.

Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *