Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102

передача неявного указателя this в функцию

25.05.2020, 03:17. Показов 2095. Ответов 15

Студворк — интернет-сервис помощи студентам
Добрый день!

Подскажите как указатель this передать в функцию?
По задаче, класс частица базовый, от него наследуют два класса легкая частица и тяжелая. Цвет тяжелой задается массивом, который в свою очередь является объектом класса сolorArray. В это классе должны быть методы для работы с массивом.
Происходит столкновение, определяется тип частиц которые столнулись.
C++
1
2
3
4
//  heavy particles collision
        if (obj1->getType() & obj2->getType() == TYPE_HEAVY) {
            obj1->changeColor(obj2);
        }
это из функции сollision, например зафикцировано столкновение тяжелых частиц. Соответвенно, одна из частиц делает вызов функции дабы изменить цветовой массив. И здесь самое интересное, как передать this в функцию

C++
1
2
3
4
// calling a function that changes the color of a heavy particles
    virtual auto changeColor(std::unique_ptr<Particle>& prtcl) ->void {
        this->color.change_color_array(          ЗДЕСЬ           ,prtcl);
    }
Получается, что до вызова метода класса colorArray я дотащил только одну из частиц.
Пожалуйста объясните. Буду также благодарен, если вы укажете еще на те ошибки что заметили. Спасибо!

Ниже код программы, не полностью!


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
enum Particle_types {
    TYPE_LIGHT,
    TYPE_HEAVY,
};
 
class Particle {
protected: 
    double x, y;
    double vx, vy;
    double radius;
public:
    Particle() : Particle(0, 0, 0, 0, 0) {}
    Particle(double ax, double ay, double avx, double avy, double aradius)
        : x(ax), y(ay), vx(avx), vy(avy), radius(aradius) {}
    Particle(const Particle& obj) {}
    virtual ~Particle() {}
 
    double getX() const { return this->x; }
    double getY() const { return this->y; }
    double getVX() const { return this->vx; }
    double getVY() const { return this->vy; }
    double getRadius() const { return this->radius; }
 
    void changeSpeed(const double& avx,const double& avy) {
        x = avx;
        y = avy;
    }
 
    virtual auto Name() -> void = 0;
    virtual auto getType() -> unsigned = 0;
    virtual auto changeColor(std::unique_ptr<Particle>& prtcl) -> void = 0;
 
    virtual void Move(int deltaTime) {
        x += vx * deltaTime;
        y += vy * deltaTime;
    }
};
 
 
//  ******************************************************************************************
 
class colorArray {
private:
    std::array<unsigned, 4> color; 
public:
    colorArray() { for (auto& it : color) { it = 1; } }
    ~colorArray() {}
 
    void change_color_array( Здесь должен быть указатель this  , std::unique_ptr<Particle>& prtcl) {
        for (unsigned i = 0u, end = color.size(); i < end; ++i) {
 
 
        }
    }
 
};
 
//  ******************************************************************************************
 
class heavyParticle : public Particle {
private:
    static const unsigned heavy;
    double mass;
    colorArray color;
public:
    heavyParticle() : Particle(2, 2, 1, 0, 0), mass(0) {}
    virtual ~heavyParticle() {}
 
    //  get particle name
    virtual auto Name() -> void { std::cout << "heavyParticle" << std::endl; }
    
    //  get particle type
    virtual auto getType() ->unsigned { return this->heavy; }
    
    // calling a function that changes the color of a heavy particles
    virtual auto changeColor(std::unique_ptr<Particle>& prtcl) ->void {
        this->color.change_color_array(,prtcl);
    }
};
const unsigned heavyParticle::heavy = 1;
 
//  ******************************************************************************************
 
class System { 
private:
    std::vector<std::unique_ptr<Particle>> particles;
public:
    System(const std::initializer_list<std::unique_ptr<Particle>>& alist) {
        particles.reserve(alist.size());
        for (auto& elem : alist) {
            particles.push_back(std::move(const_cast<std::unique_ptr<Particle>&>(elem)));
        }
    }
    
    void Collision(std::unique_ptr<Particle>& obj1, std::unique_ptr<Particle>& obj2) {
        auto vx1 = obj1->getVX();
        auto vx2 = obj2->getVX();
        auto vy1 = obj1->getVY();
        auto vy2 = obj2->getVY();
        
        //  light particles collision
        if (obj1->getType() & obj2->getType() == TYPE_LIGHT) {
            obj1->changeSpeed(vx2, vy2);
            obj2->changeSpeed(vx1, vy1);
        }
        //  heavy particles collision
        if (obj1->getType() & obj2->getType() == TYPE_HEAVY) {
            obj1->changeColor(obj2);
        }
        //  light and heavy particles collision
        /*if () {
 
        }*/
        
    }
 
    bool check_Collision(const std::unique_ptr<Particle>& obj1, const std::unique_ptr<Particle>& obj2) const {
        double x1 = obj1->getX();
        double x2 = obj2->getX();
        double y1 = obj1->getY();
        double y2 = obj2->getY();
        
        if ((std::abs(x2 - x1) & std::abs(y2 - y1)) <= (obj2->getRadius() + obj1->getRadius())) {
            return true;
        }
        else 
            return false;
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2020, 03:17
Ответы с готовыми решениями:

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

передача указателя на функцию
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate: невозможно преобразовать параметр 2 из...

Передача указателя на функцию
Есть класс в котором: typedef void(*setChar)(int x, int y, wchar_t c); void Paint(setChar SetChar) В другом классе...

15
Злостный нарушитель
 Аватар для Verevkin
10234 / 5663 / 1260
Регистрация: 12.03.2015
Сообщений: 26,255
25.05.2020, 04:11
Цитата Сообщение от Glbvnts Посмотреть сообщение
Подскажите как указатель this передать в функцию?
Покажи саму функцию. Какие параметры она принимает?
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
25.05.2020, 04:19  [ТС]
функция change_color_array. Я вроде бы все что взаимосвязанно сразу написал.

[/quote]
Цитата Сообщение от Glbvnts Посмотреть сообщение
class heavyParticle : public Particle {
private:
    static const unsigned heavy;
    double mass;
    colorArray color;
public:
    heavyParticle() : Particle(2, 2, 1, 0, 0), mass(0) {}
    virtual ~heavyParticle() {}
//  get particle name
    virtual auto Name() -> void { std::cout << "heavyParticle" << std::endl; }
//  get particle type
    virtual auto getType() ->unsigned { return this->heavy; }
// calling a function that changes the color of a heavy particles
    virtual auto changeColor(std::unique_ptr<Particle>& prtcl) ->void {
        this->color.change_color_array(,prtcl);
    }
};
проблема в том, что в нее неявно указатель на частицу не передается, передается только на объект-поле этой частицы, color.
может быть проблемы нет вообще? и мне не нужно передавать указатель на частицу, так как неявный указатель там уже на нужный мне массив, что думаете ?)
0
Злостный нарушитель
 Аватар для Verevkin
10234 / 5663 / 1260
Регистрация: 12.03.2015
Сообщений: 26,255
25.05.2020, 04:32
Цитата Сообщение от Glbvnts Посмотреть сообщение
функция change_color_array
Нету у тебя такой функции. Метод класса есть с таким именем, а функцию я не нашёл.
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
25.05.2020, 04:39  [ТС]
ну вот чего вы предираетесь ?Называйте как вам нравится, функция-метод, метод.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.05.2020, 04:48
Glbvnts, возможно будет больше толку, если вы прочитаете чего-нибудь о двойной диспетчеризации. Вы же именно ее тут пытаетесь сделать?
1
Злостный нарушитель
 Аватар для Verevkin
10234 / 5663 / 1260
Регистрация: 12.03.2015
Сообщений: 26,255
25.05.2020, 04:49
Цитата Сообщение от Glbvnts Посмотреть сообщение
ну вот чего вы предираетесь ?Называйте как вам нравится, функция-метод, метод.


Это же одно из фундаментальных понятий ООП. Без понимания, чем функция отличается от метода, соваться в ООП не надо.
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
25.05.2020, 04:50  [ТС]
Спасибо за подсказку, не могу ответить на ваш вопрос, потому как не знаю такого термина
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.05.2020, 04:52
Glbvnts, да я догадывался, поэтому и даю вам ссылку (можете сами поискать, наверняка на том же хабре есть статьи), чтобы вы сами посмотрели и разобрались то это или не то. Потому что пока что прямо ответить на ваш вопрос затруднительно.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
25.05.2020, 05:08  [ТС]
Verevkin, я разберусь без Вас. Всего хорошего.

Добавлено через 13 минут
DrOffset, да, скорее всего вы определили очень точно, что мне необходимо. Ещё раз спасибо, есть от чего оттолкнуться.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.05.2020, 05:23
Цитата Сообщение от Glbvnts Посмотреть сообщение
std::unique_ptr<Particle>& prtcl
Если вы не собираетесь передавать владение через эту ссылку, то делать тут unique_ptr не очень хорошая идея.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.05.2020, 07:02
Цитата Сообщение от Verevkin Посмотреть сообщение
Это же одно из фундаментальных понятий ООП. Без понимания, чем функция отличается от метода, соваться в ООП не надо.
Цитата Сообщение от Verevkin Посмотреть сообщение
Нету у тебя такой функции. Метод класса есть с таким именем, а функцию я не нашёл.
В C++ методов нет. Если придираться, так по полной.
0
Злостный нарушитель
 Аватар для Verevkin
10234 / 5663 / 1260
Регистрация: 12.03.2015
Сообщений: 26,255
25.05.2020, 07:35
Цитата Сообщение от Croessmah Посмотреть сообщение
В C++ методов нет.
Действительно, чойто я, а?

0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.05.2020, 07:44
Verevkin, видео-уроки? Серьезно? Ух Ты! Теперь всё ясно!
0
Злостный нарушитель
 Аватар для Verevkin
10234 / 5663 / 1260
Регистрация: 12.03.2015
Сообщений: 26,255
25.05.2020, 09:01
Цитата Сообщение от Croessmah Посмотреть сообщение
видео-уроки? Серьезно? Ух Ты! Теперь всё ясно!
Я этого не говорил.
Это ты сказал.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.05.2020, 09:52
Цитата Сообщение от Verevkin Посмотреть сообщение
Это ты сказал.
Ну это ты начал придераться к функциям. А сам методами называешь то, что методами в C++ не называется.

Цитата Сообщение от из книжки для ТС'а, чтобы был в курсе
По историческим причинам функции-члены называют также методами.Такое название имеет смысл в других объектно-ориентированных языках программирования, но бессмысленно в C++. Несмотря на это, термин приобрел некоторую популярность и среди программистов на C++, наверное, поскольку его проще выговорить, чем выражение "функция-член"(то, что это звучит гораздо внушительнее, никого не волнует). Так что если во время вечеринки ваши друзья начнут сыпать словечками вроде "методы класса", просто мысленно замените "методы" выражением "функиии-члены", и все встанет на свои места. Поскольку термин "метод" смысла в C++ не имеет, я не буду использовать его в этой книге.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2020, 09:52
Помогаю со студенческими работами здесь

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

Передача в функцию указателя
Почему плохо передавать в функцию указатель на строку или массив и возвращать указатель на строку или массив?

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

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

Передача указателя на функцию
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее указатель? пример class C1 { public: void...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru