Форум программистов, компьютерный форум CyberForum.ru

Передача функции заранее неизвестного объекта - C++

Восстановить пароль Регистрация
 
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 69
13.12.2013, 21:59     Передача функции заранее неизвестного объекта #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
#include <iostream>
#include "Cat.h"
#include "Dog.h"
using namespace std;
 
void makeItVoice( /* указатель на экземпляр заранее неизвестного класса */)
{
    /* указатель на экземпляр заранее неизвестного класса */.voice();
}
 
int main( void )
{
    Cat Frisky;
    Dog Chappi;
    try // проверяем, возможен ли вызов функции voice
    {
        makeItVoice( /* Frisky или Chappi */ );
    }
    catch
    {
    /* Обработка ошибки */
    }
    return 0;
}
C++
1
2
3
4
5
6
#include <iostream>
 
class Cat
{
    void voice() const { std::cout << "Meow" << std::endl; }
};
C++
1
2
3
4
5
6
#include <iostream>
 
class Dog
{
    void voice() const { std::cout << "Woof" << std::endl; }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2013, 21:59     Передача функции заранее неизвестного объекта
Посмотрите здесь:

C++ Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
Массив заранее неизвестного размера C++
Как правильно вызывать функцию объекта из другой функции того же объекта? C++
При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
C++ Как вызвать конструктор для неизвестного объекта?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.12.2013, 22:14     Передача функции заранее неизвестного объекта #2
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
#include <iostream>
 
struct Animal
{
    virtual void voice() const = 0;
};
 
class Dog : public Animal
{
    void voice() const { std::cout << "Woof" << std::endl; }
};
 
class Cat : public Animal
{
    void voice() const { std::cout << "Meow" << std::endl; }
};
 
void makeItVoice(const Animal& animal)
{
    animal.voice();
}
 
int main() 
{
    Cat Frisky;
    Dog Chappi;
    makeItVoice(Chappi);
    makeItVoice(Frisky);
}
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 69
13.12.2013, 22:15  [ТС]     Передача функции заранее неизвестного объекта #3
Jupiter, А есть вариант без использования наследования?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.12.2013, 22:16     Передача функции заранее неизвестного объекта #4
Sublimee, если без шаблонов и без наследования, то вы ошиблись языком
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 69
13.12.2013, 22:36  [ТС]     Передача функции заранее неизвестного объекта #5
Jupiter, не подскажите как обработать ошибку при передаче несоответствующего типа? Try-catch не помог.
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>
#include "Cat.h"
#include "Dog.h"
 
template <typename Type>
 void makeItVoice( const Type& animal )
{
    animal.voice();
}
 
int main( void )
{
    Cat Frisky;
    Dog Chappi;
 
    try
    {
        makeItVoice( Frisky );
        makeItVoice( Chappi );
        makeItVoice( 1 );         // ошибка
    }
    catch(...)
    {
        std::cout << "What kind of animal!?" << std::endl;
    }
    return 0;
}
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.12.2013, 23:15     Передача функции заранее неизвестного объекта #6
Sublimee, на этапе компиляции уже известно какой тип у аргумента функции makeItVoice, и требование к этому типу(в вашем коде) - наличие метода voice.
у простого int методов нет вообще, потому ваш код и не компилируется
Yandex
Объявления
13.12.2013, 23:15     Передача функции заранее неизвестного объекта
Ответ Создать тему
Опции темы

Текущее время: 14:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru