Как передать объект класса в функцию c
Перейти к содержимому

Как передать объект класса в функцию c

  • автор:

Как передать объект класса по ссылке?

Если Вы «пытаетесь познать C++», то хотя бы книгу откройте по языку. Любую. Тогда таких вопросов появляться не будет.

21 июн 2016 в 18:02

Зря @ixSci читаете нравоучения. Q&A не для дискуссий и высоких материй. Вообще, сходу не нашел ответа на вопрос для Си++ в базе вопросов, так что сам по себе вопрос считаю адекватным, вот первый ответ, близкий по духу. Формулировка, вопроса конечно страдает, требуется правка. Лучше переформулируйте вопрос за автора, он просто не знает, что в нем написать. Думаю, против ни кто не будет.

21 июн 2016 в 18:41

Не понимаю, с чего вдруг Вы тут разводите цензуру. Не нравится вопрос — поднимайте тревогу, пусть модераторы решают. Совсем не обязательно дергать самолюбие авторов. Я вообще такие вопросы пропускаю мимо ушей. Этот привлек внимание как раз отрицательной оценкой.

22 июн 2016 в 8:04

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

Для начала рассмотрим принимающую сторону, т.е. функцию или метод класса, в который передается ссылка на объект. В простейшем случае это выглядит так:

void foo(ObjectType& object) 

К типу передаваемого объекта добавляется символ & , причем его можно размещать как вплотную к типу, так и к имени объекта. Это зависит от стиля программирования.

При передачи объекта по ссылке не происходит копирования, т.е. мы по сути передаем адрес на объект, что быстрее и менее затратно по памяти. Плюс ко всему мы работаем непосредственно с объектом, переданным по ссылке. Если же объект исключительно входной и не должен быть изменен, то следует добавить модификатор const:

void foo(const ObjectType& object) 

Теперь, изменить объект object в функции не получится. Чтобы было возможно вызывать методы класса object они должны быть объявлены как const . Следует отметить, что есть понятие «ссылки на константу» а есть «константная ссылка». В данном случае мы имеем дело с первым понятием.

Теперь перейдем непосредственно к передаче объекта. Тут есть три варианта:

ObjectType myObject; foo(myObject); 
ObjectType* myObject = new ObjectType(. ); foo(*myObject);` 
ObjectType& myObject = otherObject; foo(myObject); 

Не могу передать объект класса в функцию

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

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

Не могу передать объект в функцию
Добрый день. Не получается получить доступ к атрибутам объекта User из функции Galerey. Что я.

Как передать в функцию объект класса, будет ли это эффективно?
Я создаю график: zedGraph3.Location = new System.Drawing.Point(20, 10); //Для OFDM .

Как передать объект класса в метод класса?
Здравствуйте, каким образом передать объект класса в метод класса? Вот код: class Program

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551

Лучший ответ

Сообщение было отмечено eXpl01TeR как решение

Решение

Передайте по значению, а не по ссылке.
Регистрация: 14.08.2019
Сообщений: 744

zss, Это из-за этого?

Добавлено через 1 минуту
zss, Ох ох ох, Вы просто супер! Сработало, спасибо!

Добавлено через 38 секунд
zss, Если не сложно, объясните, пожалуйста, почему когда по ссылке передавал оно ругалось?

Эксперт С++

13422 / 10694 / 6385
Регистрация: 18.12.2011
Сообщений: 28,551
eXpl01TeR, ну подумайте:
ссылка является синонимом,
а синонимом чего она будет в Вашем вызове?
18748 / 9764 / 2388
Регистрация: 30.01.2014
Сообщений: 17,117

Лучший ответ

Сообщение было отмечено eXpl01TeR как решение

Решение

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

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

eXpl01TeR, ссылка должна быть константная.

Передача объектов в функции

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

Эта программа выведет на экран следующий текст:

Constructing 1
This is local i: 2
Destroying 2
This is i in main: 1
Destroying 1

Обратим внимание, что имели место два вызова деструктора, в то время как конструктор вызы­вался только один раз. Выведенный текст иллюстрирует, что функция-конструктор не вызывается, когда копия объекта о (в программе main()) передается переменной ob (внутри функции f()). Причина, по которой конструктор не вызывался при создании копии объекта, может быть легко понята. Когда объект передается в функцию, нужно текущее состояние этого объекта. Если бы при создании копии вызывался конструктор, то осуществлялась бы инициализация объекта, ко­торая бы изменила его состояние. Поэтому конструктор не может вызываться при создании ко­пии объекта для передачи в функцию.

Хотя функция-конструктор не вызывалась при передаче объекта в функцию, необходимо вызы­вать деструктор при уничтожении копии. (Копия объекта уничтожается, как и любая локальная переменная, после окончания выполнения функции.) Надо иметь в виду, что копия объекта су­ществует до тех пор, пока исполняется функция. Это означает, что копия может выполнять опе­рации, которые потребуют вызова деструктора для уничтожения этой копии. Например, копия может резервировать память, которую необходимо освободить при ее уничтожении. По этой причине при уничтожении копии необходимо вызывать деструктор.

Суммируем сказанное. При создании копии объекта для передачи ее в функцию конструктор объекта не вызывается. Однако, когда копия объекта внутри функции уничтожается, деструктор вызывается.

По умолчанию при создании копии объекта появляется его побитовая копия. Это означает, что новый объект служит точным дубликатом оригинала. Тот факт, что создается точная копия, может в некоторых случаях служить источником для беспокойства. Хотя для передачи объекта в функцию используется обычный механизм передачи по значению, который в теории защищает и изолирует вызываемый аргумент, остается возможность побочных эффектов, в результате кото­рых может быть поврежден объект, используемый как аргумент. Например, если некоторый объект, используемый как аргумент, резервирует память и освобождает эту память при своем уничтоже­нии, тогда его локальная копия внутри функции освободит ту же самую память при вызове де­структора. В результате исходный объект окажется поврежденным и по существу бесполезным. Можно предотвратить возникновение подобных проблем с помощью определения оператора копирования для собственного класса путем создания специ­ального типа конструктора, который называется конструктором копирования.

Как передать объект класса в функцию c

1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.

Модераторы: B.V., Qraizer
‘> Классы: как передать метод класса как callback-функцию?

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

Сообщ. #1 , 16.04.09, 08:56

Рейтинг (т): 506

Можно выделить несколько видов ситуаций, когда возникает подобного рода задача. Каждый из них должен быть рассмотрен отдельно. Общее же для всех ситуаций заключается в том, что метод класса не есть обычная функция. У него другое соглашение о вызове (calling conversion), заключающееся в том, что в качестве первого параметра обязательно передается указатель на экземпляр класса, для которого должен вызываться метод. А потому всегда:
— Указатель на метод класса нельзя передать туда, где требуется указатель на свободную функцию (пусть даже с такой же сигнатурой);
— Сохранения только указателя на метод класса недостаточно. Для вызова метода необходимо иметь указатель на экземпляр класса;
— Вызов метода класса по указателю осуществляется с помощью оператора «доступ к члену по указателю» (‘.*’ или ‘->*’), где слева стоит объект класса, а справа — указатель на член класса (pointer-to-member). В нашем случае — указатель на метод класса.
Далее будут рассмотрены несколько различных ситуаций, где задача сохранения указателя на метод и указатель на экземпляр будут решаться чуть-чуть по-разному. Различие (в основном) заключается в поведении вызывающей стороны (т. е. той стороны, которая будет вызывать метод класса по указателю). А от этого может зависит то, что нужно будет сделать на вызываемой стороне (т. е. в классе, метод которого будет вызываться по указателю).

1. Функция-делегат.
Эта ситуация характерна следующим. Вызывающая сторона имеет возможность сохранить у себя как указатель на метод класса, так и указатель на объект класса, для которого будет вызываться этот метод. Следовательно, когда происходит связывание (передача указателей вызываемой стороны вызывающей стороне), тем или иным образом передается как указатель на метод, так и указатель на объект. Например:

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

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