0 / 0 / 0
Регистрация: 24.02.2014
Сообщений: 14
1

Вызов метода с одним именем у объектов разных типов

20.06.2016, 22:08. Показов 2112. Ответов 21
Метки нет (Все метки)

Здравствуйте. Подскажите как решить задачу.
Есть 3 класса: A, B, C которые не связаны друг с другом и не наследуют от общего класса. В этих 3-х классов есть один метод, так и называется void method().
Нужно создать класс Клиент, конструктор которого принимает обьект одного с выше перечисленых классов и может пользоватся методом этих классов.

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 A
{
public:
    void method()
    {
        cout << "Method A" << endl;
    }
};
 
class B
{
public:
    void method()
    {
        cout << "Method B" << endl;
    }
};
 
class C
{
public:
    void method()
    {
        cout << "Method C" << endl;
    }
};
 
class Client
{
///???
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2016, 22:08
Ответы с готовыми решениями:

Вызов одного метода у разных типов
Как запустить метод AnyMethod, если pl может принимать несколько типов, но все они с методом...

Вызов одинакового метода для разных объектов из массива
Напишите три класса: Secretary, Director и Programmer. Каждый из них должен содержать метод...

Хранение разных типов данных под одним указателем
Добрый день. Необходимо по одному указателю хранить структуры разных типов. Для этого для разных...

Открытие разных страниц с данными из MySQL с одним и темже именем и паролем
Делая запрос к табл. MySQL из Php, мы подключаемся с помощью mysql_connect, где необходимо указать...

21
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
20.06.2016, 22:22 2
C++
1
2
3
4
5
6
7
8
class Client
{
public:
    Client(A& a) // пусть это будет класс А
    {
        a.method();
    }
};
1
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
20.06.2016, 23:48 3
Без наследования:
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
struct Client
{
A *a;
B *b;
C *c;
 
 
 
 
Client(A *a_, B *b_, C *c_) 
:a(a_), b(b_), c(c_)
{}
Client(A &a_) //остальные аналогично
:a(&a_), b(nullptr), c(nullptr)
{}
void method()
{
if(a!=nullptr)
{
        a.method();
return;
}
if(b!=nullptr)
{
        b.method();
return;
}
if(c!=nullptr)
{
        c.method();
return;
}
    }
};
 
 
//где-то
A *objA;
Client client(&objA, nullptr, nullptr);
client.method();
0
2756 / 1910 / 569
Регистрация: 05.06.2014
Сообщений: 5,560
21.06.2016, 00:21 4
Лучший ответ Сообщение было отмечено MrSq как решение

Решение

C++
1
2
3
4
5
6
class Client
{
public:
    template<typename Type>
    Client(const Type&value){value.method();}
};
2
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 00:46 5
Renji, шаблон - изящное решение, но
Цитата Сообщение от MrSq Посмотреть сообщение
Нужно создать класс Клиент, конструктор которого принимает обьект одного с выше перечисленых классов
а в случае шаблона будут создаваться разные типы. То есть, создать коллекцию из них не получится, например.
0
2756 / 1910 / 569
Регистрация: 05.06.2014
Сообщений: 5,560
21.06.2016, 00:50 6
Цитата Сообщение от IGPIGP Посмотреть сообщение
а в случае шаблона будут создаваться разные типы. То есть, создать коллекцию из них не получится, например.
С чего бы? Шаблоном является конструктор, а не весь класс. А в коллекции не конструкторы собираются.
0
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 00:55 7
Цитата Сообщение от Renji Посмотреть сообщение
Шаблоном является конструктор
Конструктор это чертёж, а шаблон это чертёж чертежей. Это не конструктор. Конструктор рождается после инстанцирования шаблона конкретными параметрами. То есть:
Client<A>
и Client<B> это разные типы. Я это имел ввиду.
0
2756 / 1910 / 569
Регистрация: 05.06.2014
Сообщений: 5,560
21.06.2016, 01:00 8
Лучший ответ Сообщение было отмечено IGPIGP как решение

Решение

Цитата Сообщение от IGPIGP Посмотреть сообщение
Конструктор рождается после инстанцирования шаблона конкретными параметрами.
Что-то я не понял, вы откуда это инстанцирование вытащили?
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
class A
{
public:
    void method()const{cout<<"A"<<endl;}
};
 
class B
{
public:
    void method()const{cout<<"B"<<endl;}
};
 
class Client
{
public:
    template<typename Type>
    Client(const Type&value){value.method();}
};
 
int main()
{
    A a;
    B b;
    Client c1(a);
    Client c2(b);
    c1=c2;//Разные типы, говорите?
}
И все отлично компилируется.
2
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 01:04 9
Цитата Сообщение от Renji Посмотреть сообщение
Что-то я не понял, вы откуда это инстанцирование вытащили?

Прошу прощения. Я подумал - класс обобщенный, а тут только конструктор! Интересный код)
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
21.06.2016, 02:39 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я подумал - класс обобщенный, а тут только конструктор!
глаз замылился?
Цитата Сообщение от Renji Посмотреть сообщение
Шаблоном является конструктор, а не весь класс.
1
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 08:36 11
Цитата Сообщение от Croessmah Посмотреть сообщение
глаз замылился?
да
Забавный конструктор. Он запускает метод. Но "пользоваться" это не же не запускать в конструкторе. Я понимаю фразу:
Цитата Сообщение от MrSq Посмотреть сообщение
класс Клиент, конструктор которого принимает обьект одного с выше перечисленых классов и может пользоватся методом этих классов.
что объект класса может запускать metod() по необходимости. А могло бы это значить, например, что класс Client содержит метод обёртку - шаблон. Но чтобы его запустить нужен тип и значит в классе тип - параметр. Тогда выходит что и класс нужен шаблонный.
Или три указателя и шаблонный метод.
И пошло-поехало. Хотя я не настаиваю. Вариант с указателями громоздок.
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
21.06.2016, 11:10 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
что объект класса может запускать metod() по необходимости.
Ну так вполне возможно, что этот объект нужен только в конструкторе
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,246
21.06.2016, 11:28 13
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну так вполне возможно, что этот объект нужен только в конструкторе
Да можно и какой-нибудь boost::variant<A, B, C> прикрутить, если оно таки нужно не только в констукторе.
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
21.06.2016, 11:31 14
Цитата Сообщение от DrOffset Посмотреть сообщение
Да можно и какой-нибудь boost::variant<A, B, C> прикрутить, если оно таки нужно не только в констукторе.
Позавчера писал нечто вроде boost::any,
так что и без буста задача решаема.
Не все хотят использовать boost
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,246
21.06.2016, 11:36 15
Цитата Сообщение от Croessmah Посмотреть сообщение
Не все хотят использовать boost
Я что, заставляю?
Принципы позаимстствовать, впрочем, никто не мешает. Открещиваться от такого богатства идей - неразумно.
0
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 13:24 16
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну так вполне возможно, что этот объект нужен только в конструкторе
Метод в конструкторе имеете ввиду? Объект можно убить бросив исключение после завершения метода. То есть метод без объекта возможен.
Ну хорошо, - посмотрим ещё разок:
Цитата Сообщение от MrSq Посмотреть сообщение
Нужно создать класс Клиент, конструктор которого принимает объект одного из выше перечисленных классов и может пользоваться методом этих классов.
Ваша думай у ихней нет слов сказать "конструктор принимает и запускает"?
Наша думай, - Ваша тянет уши ихняя задача.
0
2756 / 1910 / 569
Регистрация: 05.06.2014
Сообщений: 5,560
21.06.2016, 19:03 17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваша думай у ихней нет слов сказать "конструктор принимает и запускает"?
Ну так конструктор "может пользоваться", а не клиент.
0
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 20:47 18
Цитата Сообщение от Renji Посмотреть сообщение
Ну так конструктор "может пользоваться", а не клиент.
Пользоваться и один раз запустить это не одно и то же. И речь шла о классе, то есть объекте. Жизненный цикл объекта это не только конструирование.
Renji, украинская сборная проигрывает польской и чувство юмора мне изменяет. Хотя тема прикольная, конечно. То что А, В, С не связаны не означает что их нельзя связать. Как по мне, если уж не придерживаться буквы задания, то в духе задания доступ через интерфейсную ссылку. Интерфейс - обёртка:
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
#include <iostream>
using namespace std;
 
class A
{
public: void method(){cout<<"Method A"<<endl;};
};
class B
{
public: void method(){cout<<"Method B"<<endl;};
};
class C
{
public: void method(){cout<<"Method C"<<endl;};
};
 
class Client
{
public:
virtual void method()=0;
static Client *iterfaceRefClient(A&);//это понты конечно
static Client *iterfaceRefClient(B&);//поскольку лишняя зависимость
static Client *iterfaceRefClient(C&);//лучше создавать указатели поместу
};
 
class Client_A :public Client
{
A *a;
public:
Client_A(A &a_):a(&a_){} 
void method(){a->method();}
};
 
class Client_B :public Client
{
B *b;
public:
Client_B(B &b_):b(&b_){} 
void method(){b->method();}
};
 
class Client_C :public Client
{
C *c;
public:
Client_C(C &c_):c(&c_){} 
void method(){c->method();}
};
 
Client *
Client::iterfaceRefClient(A &a){return new Client_A(a);}
Client *
Client::iterfaceRefClient(B &b){return new Client_B(b);}
Client *
Client::iterfaceRefClient(C &c){return new Client_C(c);}
 
int main(int argc, char* argv[])
{
 
A a;
B b;
C c;
 
Client *clients[] = {
    Client::iterfaceRefClient(a),  
    Client::iterfaceRefClient(b), 
    Client::iterfaceRefClient(c)
}; 
 
size_t n=sizeof(clients)/sizeof(clients[0]);
for(size_t i=0; i<n; ++i)clients[i]->method();
 
cout<<endl;
system("pause");
return 0;
}
0
Форумчанин
Эксперт CЭксперт С++
8191 / 5041 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.06.2016, 20:56 19
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
public: void method(){cout<<"Method A"<<endl;};
};
class B
{
public: void method(){cout<<"Method B"<<endl;};
};
class C
{
public: void method(){cout<<"Method C"<<endl;};
};
Почему-то захотелось написать
C++
1
#define X(A) class A { public: void method() const { std::cout << "Method " << #A << std::endl; } }
0
Комп_Оратор)
Эксперт по математике/физике
8758 / 4500 / 605
Регистрация: 04.12.2011
Сообщений: 13,428
Записей в блоге: 16
21.06.2016, 21:20 20
MrGluck, это цитата из задания ТС и я не при чём. Почти. "Почти", - потому как в тему вошёл-таки.
Обычно, сначала объявляется интерфейс, а потом клиенты его реализуют. Тут случай когда де-факто, клиенты реализуют метод с одним и тем же именем. Остаётся приаттачить интерфейс.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2016, 21:20
Помогаю со студенческими работами здесь

Вызов объектов Wscript.Shell с именем из переменной
Задача: есть переменная, в которой задается количество объектов Wscript.Shell, которые надо...

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

Динамическое добавление объектов разных типов
Цель следующая, хочу сделать что-то вроде категорий (лейблы) и подкатегорий(чекбоксы). ...

Вызов метода у всех объектов одновременно
У меня есть функция, которая создаёт объект и сразу заносит его в вектор. Программа сама по себе...


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

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

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