-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
1

Передача объекта в качестве аргумента функции (метода)

13.06.2015, 07:11. Показов 3942. Ответов 15
Метки нет (Все метки)

На "Интуите" имеем код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Complex {
public:
     int real;   // вещественная часть
     int imaginary;   // мнимая часть
     void Add(Complex x); 
          // прибавить комплексное число
};
. . . . . . . .. . . 
.
.
.
. . . . . . .. . . . 
int
main()
{
 Complex number;
 Complex num2;
 number.Add(num2);
}
меня смущает то, как метод работает с real:
C++
1
2
3
4
5
6
void
Complex::Add(Complex x)
{
     real = real + x.real;
     imaginary = imaginary + x.imaginary;
}
Хорошо, пусть real это поле (свойство) объекта x типа (класса) Complex. Но тогда парадоксально:
C++
1
real = real + x.real
Откуда в данном методе берется real, когда она может существовать только как x.real ?
Да, есть пояснение в описании функции:
C++
1
2
3
4
5
6
7
void
Complex::Add(Complex x)
{
   this->real = this->real + x.real;
   this->imaginary = this->imaginary + 
                     x.imaginary;
}
следующего рода:
"Запись this-> говорит о том, что атрибут принадлежит к тому объекту, который выполняет метод Add ( объекту, получившему сообщение Add ). В большинстве случаев this-> можно опустить."
Итак, в данном случае методу Add передается копия (ведь мы же работаем не через указатель адреса) объекта num2.
Если this-> - это real объекта х, скопированного с объекта num2, то по сути это и есть x.real, он же самый.
Что this->real, что просто real "this-> можно опустить", что x.real - одно и то же? Почему разное написание?
И еще.
В Си, как я помню, невозможно передать структуру по ссылке, а только отдельные поля.
В Си++ для объектов это также невозможно?

Добавлено через 1 минуту
ДА, и общий код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// определение класса комплексных чисел
class Complex {
public: 
     int real; // вещественная часть
     int imaginary; // мнимая часть
     void Add(Complex x);   
       // прибавить комплексное число
};
// определение метода сложения
void
Complex::Add(Complex x)
{
     real = real + x.real;
     imaginary = imaginary + x.imaginary;
}
int
main()
{
Complex number;
     number.real = 1;  
             // первый объект класса Complex
     number.imaginary = 3;
     Complex num2;   
             // второй объект класса Complex
     num2.real = 2;
     num2.imaginary = 1;
     number.Add(num2);  
             // прибавить значение второго
             // объекта к первому
     return 1;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2015, 07:11
Ответы с готовыми решениями:

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

Передача объекта ifstream в качестве аргумента функции
Как решить данную проблему? vector<DataPerson> GetVector() { ifstream file("input.txt"); if...

Передача enum в качестве аргумента метода класса
Есть класс //class order; class ticket{ enum type_of_place { coupe, general, berth, wagon_lit...

Шаблон в качестве аргумента метода(функции)
Доброго дня! Возник вопрос. Существует ли возможность определить параметр метода, указав тип...

15
Модератор
Эксперт С++
12768 / 10226 / 6146
Регистрация: 18.12.2011
Сообщений: 27,377
13.06.2015, 07:16 2
Все таки вы забываете, что методу кроме параметров передается еще указатель на объект, который его вызвал.
Этот указатель называется this. В коде его обычно можно опускать, и, то, что вы написали
real = real + x.real;
действительно означает
C++
1
this->real = this->real + x.real;
или покрасивее
C++
1
this->real += x.real;
1
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
13.06.2015, 07:25  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
методу кроме параметров передается еще указатель на объект
разве в качестве параметра передается не сам объект?
C++
1
2
3
4
void Add(Complex x);
. .. . . . .  .
 . .  . . . . . 
number.Add(num2);
Добавлено через 1 минуту
мы передали объект num2, функция создала с него копию х и работает с ней. Вроде так кажется
0
Модератор
Эксперт С++
12768 / 10226 / 6146
Регистрация: 18.12.2011
Сообщений: 27,377
13.06.2015, 07:30 4
Сам объект доступен по разыменованному *this.
Т.е., если хочется работать не с указателем, а с объектом, придется писать:
C++
1
(*this).real += x.real;
1
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
13.06.2015, 07:33  [ТС] 5
Подождите!
Объектом в методе Add будет х.
А указатель *this - даст возможность работать с вызвавшим num2 так?
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
13.06.2015, 07:35 6
Цитата Сообщение от Albaz Посмотреть сообщение
А указатель *this - даст возможность работать с вызвавшим num2 так?
this указывает на объект, у которого был вызван метод.
1
Модератор
Эксперт С++
12768 / 10226 / 6146
Регистрация: 18.12.2011
Сообщений: 27,377
13.06.2015, 07:36 7
Цитата Сообщение от Albaz Посмотреть сообщение
number.Add(num2);
num2 - это x
number - это *this
1
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
22.06.2015, 07:28  [ТС] 8
"this-> говорит о том, что атрибут принадлежит к тому объекту, который выполняет метод Add"
Не пойму. Выполняющим может быть не объект, а функция, метод.
Объект может вызывать метод своего родителя-класса, в теле объекта выполняются действия.

Добавлено через 18 минут
Вот класс:
C++
1
2
3
4
5
class A {
public:
int a;
int f_a() { return 0;}
};
Создаем объекты:
A : B;
A : C;
Как продемонстрировать указатели?
0
Модератор
Эксперт С++
12768 / 10226 / 6146
Регистрация: 18.12.2011
Сообщений: 27,377
22.06.2015, 07:33 9
C++
1
2
3
4
5
6
7
A xa;
A xb;
A *p;
p=&xa;
p->a=1;// Меняет a из xa
p=&xb;
p->a=2;// Меняет a из xb
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
22.06.2015, 08:40  [ТС] 10
this->real указывает на какой real?
У нас три объекта: x, num2, number и у каждого свой реал.
Цитата Сообщение от 0x10 Посмотреть сообщение
объект, у которого был вызван метод
- не понимаю логику. Методы принадлежат обектам, входят в их "нутро". Значит, объект вызывает метод своего класса.
x - есть копия num2, так работают функции, за исключением массивов, где аргумет функции - на деле есть указатель на [0] элемент.
Или this-> указывает, что в теле функции должно быть обработано поле по ссулке вызывающего функцию обект.Но тогда логически ращумнее было бы сказат thet - т.е. тот, что вызвал. this - это родная копия х, преданная в метод Add

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
A xa; // создали объект ха
A xb;
A *p;// создали указатель на тип класса
p=&xa;
p->a=1;// - это эквивалент ха.а
p=&xb;
p->a=2;
Верно ли понято?

Добавлено через 42 минуты
number.Add(num2);


num2 - это x
number - это *this
тогда:
1) *this указывает на поле number
2) number вызвал метод Add с аргументом - объектом num2
3) Add создал объект х как копию с num2


Но в примере создавался указатель A *p;
В определении же функции Add аргументом указан объект х типа Complex, а не указатель типа Complex.
Объект не есть указатель.
Потому неравнозначость примеров сохраняется, не дает полной аналогии

Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
num2 - это x
- лишь если х указатель
Иначе - х - копия num2, что я и думаю. Функция работает с копией, за исключением обработки массивов.

Добавлено через 1 минуту
Complex::Add(Complex x) у нас определена не как Complex::Add(Complex* x)
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
22.06.2015, 18:29 11
Albaz, в последнем посте был целый экран каких-то мыслей, верных и не очень. Резюмирую коротко.
Пусть есть код на С++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Complex {
public:
  int real;
  int imag;
  void Add(Complex x) {
    this->real += x.real;
    this->imag += x.imag;
  }
};
 
// ...
Complex a, b;
Complex* c = new ...;
 
a.Add(b);
c->Add(b);
Этот код эквивалентен следующему сишному:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Complex {
  int real;
  int imag;
};
 
void Add(Complex* const this, Complex x) {
  this->real += x.real;
  this->imag += x.imag;
}
 
// ...
Complex a, b;
Complex* c = ...;
 
Add(&a, b);
Add(c, b);
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
05.07.2015, 04:09  [ТС] 12
this - > значит указатель на объект, вызвавший метод.
т.е. не переданный в качестве аргумента

Добавлено через 12 минут
void Add (Complex * const this, Complex x )
- т.е. аргумент - не указатель на конкретный объект типа структура, а указатель к абстрактная структура - шаблон?
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
05.07.2015, 07:37 13
Цитата Сообщение от Albaz Посмотреть сообщение
т.е. аргумент - не указатель на конкретный объект типа структура
С чего вдруг?
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
08.07.2015, 07:20  [ТС] 14
да я перепутал.
а исправить поздно - 5 мин истекли.
В целом, я понял, что вис говорит, что берется переменная данного класса, который еще не имеет объектов.
а вот в методе класса объкт создается в аргументе
void Add ( Complex x );
Здесь есть объект типа Комплекс.
А в классе Комплекс еще их нет.
Теоретически, можно вместо вис писать Комплекс для более ясной смысловой сути.
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.07.2015, 07:45 15
Цитата Сообщение от Albaz Посмотреть сообщение
В целом, я понял, что вис говорит, что берется переменная данного класса, который еще не имеет объектов.
а вот в методе класса объкт создается в аргументе
void Add ( Complex x );
Здесь есть объект типа Комплекс.
А в классе Комплекс еще их нет.
Теоретически, можно вместо вис писать Комплекс для более ясной смысловой сути.
Это либо очень искаженное восприятие реальности, либо очень криво сформулировано. Почитайте книги.
0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
08.07.2015, 07:52  [ТС] 16
но это последнее наверное будет выглядеть как работа с абстрактным классои (слабоссылочным).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2015, 07:52
Помогаю со студенческими работами здесь

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

Передача функции в качестве аргумента массив
Помогите пожалуйста! есть некая рекурсивная функция N которая принимает 2 целочисленные переменные...

Передача двумерного массива в качестве аргумента функции
Подскажите пожалуйста что не так? (Подчёркивает вот тут вот index(A); аргумент функции). Объясните...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru