Массив указателей к различным типам, возможным в C++?

Dllexport используется для маркировки функции, как экспортируется. Вы реализуете функцию в своем DLL и экспортируете его так, это становится доступным любому использующему Ваш DLL.

Dllimport является противоположным: это отмечает функцию, как импортируемую из DLL. В этом случае Вы только объявляете подпись функции и связываете Ваш код с библиотекой.

6
задан SomeUser 16 October 2009 в 18:57
поделиться

6 ответов

C ++ - это C с большим количеством вещей. Итак, если вы хотите сделать это способом C, как указано выше, вы просто создаете массив указателей void

void *ary[10];
ary[0] = new int();
ary[1] = new float();

DA.

Если вы хотите делать что-то объектно-ориентированным способом, тогда вы хотите использовать коллекцию и иметь все, что вы собираетесь добавить в коллекцию, происходит от того же базового класса объектов, который может быть добавлен в коллекцию. В java это «объект», C ++ не имеет встроенного базового объекта, но в любой библиотеке коллекций, которую вы используете, будет такая вещь, которую вы можете создать в качестве подкласса.

7
ответ дан 8 December 2019 в 02:24
поделиться

... if you use a void *, it's easy ;-)

4
ответ дан 8 December 2019 в 02:24
поделиться

Обычно, если вы хотите иметь коллекцию разных «типов» указателей, вы реализуете ее таким образом, чтобы они были производными от базового класса / интерфейса и сохраняли указатель на эту базу. Затем с помощью полиморфизма вы можете заставить их вести себя как разные типы.

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

class A : public Base
{
    void doSomething() { cout << "A\n"; } 
};

class B : public Base
{
    void doSomething() { cout << "B\n"; } 
};

std::vector<Base*> pointers;
pointers.push_back(new A);
pointers.push_back(new B);
15
ответ дан 8 December 2019 в 02:24
поделиться

Массив указателей на аннулирование уже упоминался. Если вы хотите сделать его практичным и полезным, рассмотрите возможность использования массива (или, лучше, вектора) boost :: any .

8
ответ дан 8 December 2019 в 02:24
поделиться

Да. Двумя способами:

• Указатели на тип базового класса, которые указывают на объекты типов, производных от этого базового типа.
• Нетипизированные указатели void * , которые необходимо вручную привести к реальным типам объектов, на которые они указывают.

Первый подход - это стандартное объектно-ориентированное программирование.

Второй подход полезен для низкоуровневых приложений. программирование на уровне (например, драйверы устройств, библиотеки управления памятью и т. д.) и считается опасным и подходит только для программистов, которые точно знают, что делают. Очевидно, что для определения реального типа каждого указателя требуется дополнительная бухгалтерская информация.

3
ответ дан 8 December 2019 в 02:24
поделиться

Да; просто приведите указатели в массиве к любому типу, на который вы хотите, чтобы они ссылались.

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

1
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: