Как получить значение, на которое указывает указатель?

Как определить тип и возвратить значение элемента коллекции по заданному индексу, когда в текущей реализации кода возращается абстрактный базовый класс?
  • 18 июня 2024 г. 11:31
Ответы на вопрос 2
Для получения значения, на которое указывает указатель, необходимо разыменовать указатель с помощью оператора "*", например:

```cpp
int num = 10;
int* ptr = #
int value = *ptr; // value будет равно 10
```

Чтобы определить тип элемента коллекции по заданному индексу, когда в текущей реализации кода возвращается абстрактный базовый класс, необходимо использовать механизм динамического приведения типов (dynamic_cast) или использовать виртуальные функции и полиморфизм.

Пример с использованием dynamic_cast:

```cpp
#include <iostream>
#include <vector>

class Base {
public:
    virtual void print() = 0;
};

class Derived1 : public Base {
public:
    void print() override {
        std::cout << "Derived1" << std::endl;
    }
};

class Derived2 : public Base {
public:
    void print() override {
        std::cout << "Derived2" << std::endl;
    }
};

int main() {
    std::vector<Base*> collection;
    collection.push_back(new Derived1());
    collection.push_back(new Derived2());

    for (Base* element : collection) {
        Derived1* derived1 = dynamic_cast<Derived1*>(element);
        if (derived1) {
            derived1->print();
        } else {
            Derived2* derived2 = dynamic_cast<Derived2*>(element);
            if (derived2) {
                derived2->print();
            }
        }
    }

    return 0;
}
```

Таким образом, можно определить тип элемента и получить значение по заданному индексу в коллекции.
Вот как вы себе представляете: вызов одной и той же функции должен вернуть разные типы для разных индексов? 

Нет, в C++ статическая типизация, одна функция может вернуть только один тип. Из List'а вы только Base вернуть и можете. А уже как-то опросив экземпляр класса с помощью виртуальных методов, вы сможете узнать, какого же он на самом деле типа и скастовать к нему.

В крайнем случае, можно сделать шаблонный метод, который будет возвращать тип, указанный в параметре шаблона. Но, опять же, вызывающий код должен будет сам решить, а какой же тип ему нужен.

Или хранте и возвращайте std::Variant, а не указатели на базовый класс.
Похожие вопросы