Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
4 / 4 / 1
Регистрация: 17.12.2015
Сообщений: 119

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

09.07.2016, 17:40. Показов 12348. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как научить метод принимать в качестве аргумента объект своего класса и дочерних классов? Как их передавать при вызове метода?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2016, 17:40
Ответы с готовыми решениями:

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

Указатель на метод класса в качестве аргумента метода класса
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template <class T> class MyVector { public: void swap(MyVector<T>Vector); } template <class T> void...

14
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
09.07.2016, 17:44
по ссылке, если это то, что я подумал.
C++
1
2
3
class Class {
public: Metod (Class & a);
}
0
4 / 4 / 1
Регистрация: 17.12.2015
Сообщений: 119
09.07.2016, 20:36  [ТС]
Цитата Сообщение от shilko2013 Посмотреть сообщение
public: Metod (Class & a);
Зачем & ?
0
0 / 0 / 0
Регистрация: 09.07.2016
Сообщений: 5
09.07.2016, 21:55
Цитата Сообщение от JackLas Посмотреть сообщение
Зачем & ?
Method (class & a) - это значит что вы передаете объект по ссылке и имеете дело с существующим объектом.
Mehod (class a) - будет сделана локальная копия объекта и её изменение не будет влиять на объект который был передан в этой функции.
А вообще наследники родительского класса приобретают все свойства и методы родительского класса. И объект производного класса можно смело передавать в метод который принимает ссылку на базовый класс.

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
#include <iostream>
 
using namespace std;
 
class A
{
    int x;
public:
    void Method(A & a, const int & i)
    {
        this->x = i;
        std::cout << this->x << std::endl;
    }
};
 
class B : public A
{
 
};
 
int main()
{
    A a;
    a.Method(a, 10);
    B b;
    b.Method(b, 20);
}

Так же можно сделать метод виртуальным и переопределить его в наследниках. Он станет полиморфным при вызове через указатель базового класса. Вариантов много все зависит от того что конкретно надо

Добавлено через 14 минут
Цитата Сообщение от Anglues113 Посмотреть сообщение
this->x = i;
В этом месте написать -
C++
1
 a.x = i;
и оно будет работать
0
Заблокирован
09.07.2016, 21:59
Цитата Сообщение от JackLas Посмотреть сообщение
Как научить метод принимать в качестве аргумента объект своего класса и дочерних классов? Как их передавать при вызове метода?
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
#include <string>
#include <iostream>
using namespace std;
 
class parrent{
    public:
    virtual ~parrent(){}
    static string info(parrent *obj = 0){
        string name;
        parrent * ptr = dynamic_cast< parrent *>(obj);
        if( ptr != 0 )
            name = typeid(*obj).name();
        return name; 
    }
};
 
class child1 : public parrent{};
class child2 : public child1 {};
 
int main(){
    parrent p;
    child1  ch1;
    child2  ch2;
    cout<<parrent::info(&p)<<endl;
    cout<<parrent::info(&ch1)<<endl;
    cout<<parrent::info(&ch2)<<endl;
    return 0;
}
http://codepad.org/U55N0i2U
7parrent
6child1
6child2

Не по теме:

Добавлено через 3 минуты
Anglues113, как ты собрался отличать классы без кастования?
http://codepad.org/DOHS6b0i

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
09.07.2016, 22:40
Цитата Сообщение от Unknownx Посмотреть сообщение
отличать классы
В нормальном режиме это и не требуется. Полиморфизм покрывает почти все кейсы.
0
10.07.2016, 08:39

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
В нормальном режиме это и не требуется. Полиморфизм покрывает почти все кейсы.
- хорошо перефразирую, пришёл указатель на базовый класс, для моего примера как понять что это child1 а не child2 без dynamic_cast?Опять же слово почти != всё

0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
10.07.2016, 10:05
Unknownx, в общем случае попытка выяснить тип объекта по ссылке на базовый класс говорит о каких-то проблемах в архитектуре. Идея полиморфизма заключается в том, что в наследниках класса находится код, который привязан к типу этого наследника и делает в соответствии со своим специфическим знанием что-то отличное от других наследников. При этом код, который использует указатель/ссылку на базовый класс должен работать с ним как с целостной сущностью и ни в коем случае НЕ должен начинать зависеть от того, какой на самом деле наследник базового класса был проброшен при вызове, а наследник должен реализовывать функциональность в соответсвии с заявленной в базовом классе (принцип подстановки Лисков (LSP из SOLID). Если говорить о некоторых более частных случаях, скажем в виде исключения - то может использоваться либо двойная диспетчеризация - когда с одной стороны используется полиморфизм для обработки вызова, с другой стороны вызываются разные перегрузки методов исходя из типа аргумента (Таким образом устроен boost::static_visitor для boost::variant). Наконец если используются техники типа type erasure и по какой-то причине понадобилось знать какой тип действительно находится за концепцией any/type_erasure/variant могут использоваться либо подходы с кастами ( в том числе специфические для данного типа, а не dynamic_cast, например как в any_cast). Ну и самый прямолобый вариант - просто иметь метод, который возвращает тип хранимого в базовом классе наследника (как например реализовано в QVariant::type). Если Вы приведете конкретный пример задачи, решение которой Вас интересует с точки зрения использования полиморфизма, мы могли бы подумать над тем, можно ли найти её решение без попыток выяснения типа наследника в пользователе базового класса.
0
Заблокирован
10.07.2016, 10:48
Цитата Сообщение от Melg Посмотреть сообщение
Unknownx, в общем случае попытка выяснить тип объекта по ссылке на базовый класс говорит о каких-то проблемах в архитектуре.
- глупость. Пример : я могу использовать кросс-платформенный фрейморк, в котором к примеру есть класс канвы привязанный к конкретной платформе, к примеру под маком будет макканва, под убунтой - убунтуканва, под вин винканва, каждая канва в силу различия плафторм имеет свои особенности при этом имеет общую сущность, мой рендерер должен распознать какая канва к нему пришла, а может и ноль прийти(или ты всё дефанами будешь разруливать делая спагетти код, м? Что по твоему лучше - 3 платформоспецифических канвы в разных либах или одна с 3 типами #ifdef). Думаю ты просто привык максим к виртуальным методам, а я привык работать без КуТэ сразу под несколькими осями, так что надеюсь понятно почему я написал глупость на твои слова.
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
10.07.2016, 10:57
Unknownx, Не смотря на Ваш, мягко говоря, своеобразный способ общения, мне было бы интересно узнать действительно ли Ваше положение не удастся спасти никак кроме как через выяснение типа наследника. Вы можете привести минимальный пример кода, который бы воспроизводил ситуацию? (Вот с теми же канвами) потому-что из Ваших слов мне не понятно о каких "особенностях" в канвах идет речь, и как они при этом используются в рендере. (Если у вас есть opensource проект иллюстрирующий проблему - я могу взглянуть и на него).
0
10.07.2016, 11:07

Не по теме:

Melg, очень много проприетарного кода. Лучше останемся каждый при своём мнении.

0
10.07.2016, 11:21

Не по теме:

Unknownx, тогда Ваши заявления мягко говоря голословны. В зависимости от того в чем заключались эти различия между канвами - сигнатуры методов, названия методов, наличие дополнительных методов настроек, разное поведение одних и тех же методов, и т.д. и тем как именно и для чего использует их рендер - по-разному бы звучал ответ на тему того как именно можно решать такую задачу с/без использованием знаний о типе конвы. Вопрос про #ifdef-ы к полиморфизму имеет чуть больше чем нисколько отношения, поскольку директивы препроцессора вообще на другом этапе выполняются. В общем случае я бы предпочел видеть разделенные реализации, которые тем или иным образом (pimpl, переопределение символов, подгрузка отдельной либы, условная компиляция разных единиц трансляции под платформу) объединяются под общим интерфейсом (классов/методов/функций) c которым везде в системе можно работать единым образом БЕЗ необходимости дописывать платформозависимый код в вышестоящие классы-пользователи. Возможно между платформозависимым кодом и пользователями в Вашем случае отсутствует необходимый слой адаптеров, который бы с одной стороны работал непосредственно со знанием конкретной платформы, с другой стороны - пользователям предоставлял унифицированный интерфейс с единообразным поведением под всеми платформами.

0
10.07.2016, 11:57

Не по теме:

Цитата Сообщение от Melg Посмотреть сообщение
Unknownx, тогда Ваши заявления мягко говоря голословны.
я ничего другого в твоём ответе и не ожидал услышать. За своим псевдоначитанным стилем письма(обычно его применяют чтобы замаскировать довольно низкий уровень знаний) я пока вижу весьма заурядного кодера, которому видимо доставляет удовольствие поругаться на форуме, видимо с самооценкой не сложилось, пока...

0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.07.2016, 12:20
Цитата Сообщение от Melg Посмотреть сообщение
Unknownx, Не смотря на Ваш, мягко говоря, своеобразный способ общения, мне было бы интересно узнать действительно ли Ваше положение не удастся спасти никак кроме как через выяснение типа наследника.
Судя по упоминанию ifdef и дефайнов, у него там условная компиляция, а не выяснение типа объекта на стадии исполнения.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.07.2016, 16:41
Цитата Сообщение от Unknownx Посмотреть сообщение
- глупость. Пример : я могу использовать кросс-платформенный фрейморк, в котором к примеру есть класс канвы привязанный к конкретной платформе, к примеру под маком будет макканва, под убунтой - убунтуканва, под вин винканва, каждая канва в силу различия плафторм имеет свои особенности при этом имеет общую сущность, мой рендерер должен распознать какая канва к нему пришла, а может и ноль прийти(или ты всё дефанами будешь разруливать делая спагетти код, м? Что по твоему лучше - 3 платформоспецифических канвы в разных либах или одна с 3 типами #ifdef). Думаю ты просто привык максим к виртуальным методам, а я привык работать без КуТэ сразу под несколькими осями, так что надеюсь понятно почему я написал глупость на твои слова.
У нас будет свой фреймворк! С полиморфизмом и абстракциями! И, таки, навелосипедили. Только с абстракциями косячок вышел: оказались очень страшными, поэтому все чаще приходится заниматься полиморфизмом в клиентском коде, аж руки стерли. Сопровождается использованием dynamic_cast вместо виртуальных методов. И еще что-то говорят про спагетти код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2016, 16:41
Помогаю со студенческими работами здесь

Использование метода класса как функции в качестве типизированного аргумента в методе класса
Использование метода класса как функции в качестве типизированного аргумента в методе класса C++: как правильно использовать метод ...

Какого типа std::endl ? Как сделать так, чтобы функция могла принимать endl в качестве аргумента?
Что надо указать в прототипе функции, чтобы можно передавать std::endl в качестве аргумента? Уже 3 часа голову ломаю! :wall: Помогите,...

Возможно ли создать объект своего класса, который состоит из объектов другого класса?
Возможно ли создать объект своего класса, который состоит из объектов другого класса, например: TShip = class (TStaticObj) ...

Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Друзья! Вот корректный код: class foo { public: foo() { } ...

Передача класса в качестве аргумента
Подскажите, пожалуйста, как мне реализовать подобный код: public interface DAO { Object findById(Class objectClass,long id); ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru