Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/41: Рейтинг темы: голосов - 41, средняя оценка - 4.88
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342

Аналог object в С++

20.02.2010, 04:18. Показов 8735. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class Program
{
    static void Main(string[] args)
    {
        F(5);
        F("11");
    }
    static void F(object o)
    {
        if (o is string) Console.WriteLine("string");
        else Console.WriteLine("not a string");
    }
}
Как на С++ написать такую же функцию без шаблонов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2010, 04:18
Ответы с готовыми решениями:

Object аналог в С++
Вопрос - В Java если создавать динамиечский массив то можно указать Object как тип элементов и пихать туда разные классы есть ли аналог...

Аналог Object inspector
Добрый день, подскажите компоненту или методику. Есть список классов в базе. Надо дать пользователю возможность менять его в чем-то...

Аналог Object.class для C#
Есть ли в C# аналог Java Object.class? Мне нужно определить тип объекта, и если это нужный тип, выполнить действие. На Java это...

11
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
20.02.2010, 05:09
Цитата Сообщение от HIMen Посмотреть сообщение
Как на С++ написать такую же функцию без шаблонов?
А чем шаблоны не угодили?
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
20.02.2010, 05:23  [ТС]
Нужно передать в функцию любой объект, и в зависимости от того, к какому типу он приведется выполнять разные действия.
А например такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class C
{
public:
    C(int k)
    {
        value = k;
    }
    int value;
};
template<class T>
void f(T o)
{
    try
    {
        int i = (int)o;
    }
    catch(...){}
}
void main()
{
    C c(1);
    f(c);
}
компилятор не пропускает.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
20.02.2010, 06:08
Нужно передать в функцию любой объект, и в зависимости от того, к какому типу он приведется выполнять разные действия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T> void func(T o)
{
    if(typeid(o) == typeid(int))
        std::cout << "int" << std::endl;
    else if(typeid(o) == typeid(std::string))
        std::cout << "string" << std::endl;
    else
        std::cout << "unknown..." << std::endl;
}
 
int main()
{
    int i;
    func(i);
 
    std::string s;
    func(s);
    return 0;
}
P.S. Вообще перегрузку функций как бы тоже никто не отменял )
2
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
20.02.2010, 06:21  [ТС]
То, что надо!
0
 Аватар для r4zieL
15 / 15 / 2
Регистрация: 24.01.2010
Сообщений: 46
21.02.2010, 00:38
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
template<typename T> void func(T o)
{
    if (typeid(o) == typeid(int) && o == 1)
        cout << "11";
 
}
int main()
{
    int i=1;
    func(i);
    std::string s;
    func(s);
    system("pause");
    return 0;
}
Почему не запускается такая прога?
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
21.02.2010, 01:51
1. if (typeid(o) == typeid(int) && o == 1) - разбейте на два ифа
2. подключите #include <string>
0
 Аватар для r4zieL
15 / 15 / 2
Регистрация: 24.01.2010
Сообщений: 46
21.02.2010, 03:05
Цитата Сообщение от outoftime Посмотреть сообщение
1. if (typeid(o) == typeid(int) && o == 1) - разбейте на два ифа
2. подключите #include <string>
1. уже пробовал - не помогло
2. кэп
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
21.02.2010, 03:33
r4zieL, во-первых кроме #include <string> ещё #include <typeinfo> забыл, а во-вторых валится на func(s); потому, что для строки не определено сравнение с целым числом. То есть o == 1 пыталось бы пустую строку с единицей сравнить...

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <typeinfo>
 
using namespace std;
 
template<typename T> void func(T o)
{
    if ( typeid(o) == typeid(int) )
        cout << "int(" << o << ")" << endl;
    else if ( typeid(o) == typeid(string) )
        cout << "string(\"" << o << "\")" << endl;
    else
        cout << "hz" << endl;
}
int main()
{
    int i=1;
    func(i);
    string s("helo");
    func(s);
    return 0;
}
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
21.02.2010, 10:44
Цитата Сообщение от HIMen Посмотреть сообщение
Нужно передать в функцию любой объект
typeid(T).name()
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
#include <iostream>
#include <typeinfo>
 
template<typename T>
void tp(T &X )
{
    std::cout << "< " << typeid(T).name() << " >" << std::endl;
}
//-------------------------------------------------------------------
class myBase
{
};
//-----------------------------------------------------------------
class myChild : public myBase
{
};
//===================================================================
int main()
{
    char x1;
    int x2;
    float x3;
    double x4;
    std::string x5;
 
    tp(x1);
    tp(x2);
    tp(x3);
    tp(x4);
    tp(x5);
    //-----------------------------------------------------
    myBase b;
    myChild c;
 
    std::cout << " *****************************\n";
 
    tp(b);
    tp(c);
 
    return 0;
}//==================================================================
< char >
< int >
< float >
< double >
< _STL::basic_string<char,_STL::char_trait s<char>,_STL::allocator<char> > >
***********
< myBase >
< myChild >
0
 Аватар для r4zieL
15 / 15 / 2
Регистрация: 24.01.2010
Сообщений: 46
22.02.2010, 16:19
Цитата Сообщение от easybudda Посмотреть сообщение
а во-вторых валится на func(s); потому, что для строки не определено сравнение с целым числом. То есть o == 1 пыталось бы пустую строку с единицей сравнить...
В том то и проблема. Мне нужно чтобы выполнялся примерно такой кусок кода:
C++
1
2
3
4
5
6
if (typeid(o) == typeid(int))
        if (o == 1)
            cout << "11";
    if (typeid(o) == typeid(string))
        if (o = "1")
            cout << "22";
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.02.2010, 22:10
На C++ это в общем случае решается виртуальными функциями и наследованием. Вообще-то, оно делается так и в исходном примере, просто используется уже встроенный в язык класс-родитель object с определённым универсальным набором методов для всех.
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
class Printable {
public:
    virtual void PrintType (std::ostream& stream) const = 0 {stream<<"Type unknown";}
};
 
class String: public Printable {
public:
    String(const char* str);
    void PrintType (std::ostream& stream) const {stream << "This is string";}
};
 
class Integer: public Printable {
public:
    Integer(int i);
    void PrintType (std::ostream& stream) const {stream << "This is integer";}
};
 
class Other: public Printable {
public:
    Other();
    using void Printable::PrintType (std::ostream& stream) const;
};
 
void F(const Printable& p)
{
    p.PrintType(std::cout);
}
 
int main()
{
    F(Integer(5));
    F(String("some string"));
    F(Other());
    return 0;
}
Конечно, тогда придётся наследовать все типы, которые может понадобиться передавать в F, от Printable. Однако в приведённом примере каждый вызов F применяется к объекту вполне определённого типа. То есть, необходимое действие известно статически, на этапе компиляции. В такой ситуации разумнее воспользоваться как раз шаблонами и специализацией, что позволит применять функцию к встроенным типам, а не создавать специально свои:
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
template<typename T>
void F(const T& obj)
{
    cout << "Unknown type";
}
 
template<>
void F<int> (const int& obj)
{
    cout << "Integer object";
}
 
template<>
void F<const char*> (const char* const &obj)
{
    cout << "It's a string";
}
 
template<>
void F<std::string> (const std::string& obj)
{
    cout << "It's a string too";
}
 
int main()
{
    F(5);
    F(7.7);  // double, напечатается Unknown type
    F("some string");
    F(std::string("Some string too"));
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2010, 22:10
Помогаю со студенческими работами здесь

Аналог [object class] в Swift
Всем добрый день. Наконец-то дошли руки до знакомства с RESTKit, и решил сразу попробовать это дело на Swift, чтобы сразу двух зайцев....

Uncaught TypeError: Object [object Object] has no method
Всем привет. Я новичок в этой сфере. у меня возникла ошибка в консоли при добавлении карусели на сайт: &quot;Uncaught TypeError: Object ...

NullReferenceException: Object reference not set to an instance of an object в FindObjectType как исправить?
Ошибка NullReferenceException: Object reference not set to an instance of an object в FindObjectType как исправить? скрипт 1 public...

Нулевые значения баз данных. Object reference not set to an instance of an object
В базе данных существуют пустые поля. Из базы осуществляется вывод на веб страницу в поля ввода. Поля соответствующие нулевым значениям...

Получение имени объекта. Функция public String getName(Object object) {...}
К примеру есть объекты: Object myObject111 = new Object(); File parentDirectory = new File(); Хочу такую функцию: public String...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru