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

Виртуальные методы

09.10.2022, 17:48. Показов 300. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте.

Ситуация следующая, есть программа которая принимает аргументы (их количество не известно), и исходя из этих аргументов, вызывается тот или иной метод класса - выполнение которого и будет выполнение всей программы.
Я сделал так : у меня был один класс со всеми нужными мне методами, и в main через оператор if проверял аргументы, и уже исходя проверки - вызывал тот или иной метод. Вот кусочек кода :
C++
1
2
3
 
if (*argv[2] == 'hello')
     // вызываю метод ...
Собственно проблема в том, что методов может быть много, и функция main загромождается ифками.
Как сделать "адаптивней", предполагаю с использование virtual function, ну и что-бы добавление нового метода не создавало проблем.
P.S - я начинающий, как можно проще, или примером)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2022, 17:48
Ответы с готовыми решениями:

Чистые виртуальные методы и виртуальные методы
Всем привет! В С++ существует возможность создавать виртуальную функцию и чистую виртуальную...

Виртуальные методы
...в голове не укладываются. Помогите кто может :confusion: У меня про них сложилось...

Виртуальные методы
народ вот пример с виртуальными методами, и вывод этой программы class Ancestor { public: ...

виртуальные методы
как вызвать виртуальный метод базового класса из наследуемого класса? struct A { virtual void...

Виртуальные методы
Всем доброго времени суток! Вопрос следующий. Как я могу функцией делать подмену виртуального...

4
Модератор
Эксперт С++
13508 / 10758 / 6412
Регистрация: 18.12.2011
Сообщений: 28,723
09.10.2022, 18:12 2
Цитата Сообщение от Kib1643 Посмотреть сообщение
if (*argv[2] == 'hello')
Это чушь. В один символ hello не поместиться
C++
1
if( strcmp(argv[2] , "hello")==0 )
А вопрос с виртуальными функциями не понятен.
Приведите коды классов и что именно из них надо вызывать.
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,800
09.10.2022, 18:22 3
Цитата Сообщение от Kib1643 Посмотреть сообщение
Собственно проблема в том, что методов может быть много, и функция main загромождается ифками.
Табличку ассоциативную сделай, например:
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
#include <map>
#include <iostream>
#include <string_view>
 
struct S
{
    std::string_view instance_name;
 
    int hello(int, char**)
    {
        std::cout << instance_name << ": " << "hello world" << std::endl;
        return 0;
    }
 
    int print(int argc, char** argv)
    {
        std::cout << instance_name << ":\n";
        for (int i = 0; i < argc; ++i)
            std::cout << argv[i] << '\n';
        return 0;
    }
    //...
};
 
std::map<std::string_view, int(S::*)(int, char**)> const table
{
    {"hello", &S::hello},
    {"print", &S::print},
    //...
};
 
int main(int argc, char** argv)
{
    if (argc < 2)
        return 1;
    
    auto call = table.find(argv[1]);
    if (call == table.end())
        return 2;
 
    S s{"exe"};
    return (s.*call->second)(argc - 2, argv + 2);
}
1
1 / 4 / 3
Регистрация: 14.07.2022
Сообщений: 107
09.10.2022, 19:38  [ТС] 4
zayats80888, спасибо, я с map, ещё не знаком) если не затруднить, реализовать попроще )
Другая мысля: сделать virtual методы в отдельных классах, и уже в методах делать проверку на аргументы (если проверка true - метод выполняется), но тогда в main нужно вызывать все методы
P.S - из выше сказанного мной, можно узнать мой уровень
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,800
09.10.2022, 19:50 5
Цитата Сообщение от Kib1643 Посмотреть сообщение
спасибо, я с map, ещё не знаком) если не затруднить, реализовать попроще )
Цитата Сообщение от zayats80888 Посмотреть сообщение
#include <map>
->
C++
1
#include <iterator>
Цитата Сообщение от zayats80888 Посмотреть сообщение
std::map<std::string_view, int(S::*)(int, char**)> const table
{
    {"hello", &S::hello},
    {"print", &S:rint},
    //...
};
->
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct
{
    std::pair<std::string_view, int(S::*)(int, char**)> m_table[2]
    {
        {"hello", &S::hello},
        {"print", &S::print},
        //...
    };
        
    auto find(std::string_view key) const
    {
        auto it = std::begin(m_table);
        for (; it != std::end(m_table); ++it)
        {
            if (it->first == key)
                break;
        }
        return it;
    }
 
    auto end() const { return std::end(m_table); }
} const table;
0
09.10.2022, 19:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2022, 19:50
Помогаю со студенческими работами здесь

Виртуальные методы
Здраствуйте , вот писал виртуальный метод доступа но почему то не получаеться , подскажите почему...

Виртуальные методы
Дан родительский класс Animal (поле кличка). И два наследованных от него класса-потомка: Cat (поле...

виртуальные методы
#include&lt;iostream&gt; #include&lt;stdlib.h&gt; using namespace std; class MArray { protected:...

Наследование и виртуальные методы
В описании задания буквой А) обозначается задание на базовый класс, а буквой Б) - на класс...

Виртуальные и переопределённые методы
Здравствуйте! Пусть есть очень простой базовый класс: class Base { public: virtual...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru