C ++ указатель того или иного типа? - PullRequest
0 голосов
/ 04 октября 2011

У меня есть программа, которая решает PDE в больших сетках, работающих на C, но хочу перенести ее на C ++ для изучения объектно-ориентированного программирования.

Моя проблема в том, что у меня есть две структуры данных, давайте назовем их Class1 и Class2 .Для простоты предположим, что Class1 содержит два двойных числа ( a и b ), а Class2 содержит четыре двойных числа ( a, b, c и d ).

Теперь во время выполнения я хочу сгенерировать некоторый динамический массив, который будет содержать один класс ИЛИ другие в зависимости от условий работы PDE.

Что-то вроде:

if (PDEtype == 1) pointer = new Class1[n]

else              pointer = new Class2[n]

Тогда после этого мне нужно будет получить доступ к pointer с чем-то вроде: pointer[2].a = 1.0 или pointer[4].d = 10.0 и т. д.

Объединение не будет работать, потому что мне нужно хранить наименьшее количество памяти.(Я буду работать с большими проблемами, возможно, с миллионами пунктов)

Есть ли способ сделать это в C ++?

Заранее спасибо !!!

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

то, что у вас есть, на самом деле довольно близко.проблема в том, что вам нужно заранее создать указатель и затем вызвать новый Class1 [n].Похоже, вашей проблеме нужно заранее выяснить, как объявить указатель.

Есть два варианта, о которых я могу подумать:

1) не беспокойтесь об объявлении двух разных типов указателей.,объявлять ОДИН тип указателя (в этом случае имеет смысл иметь это Class2 - поскольку Class1 можно рассматривать как «подмножество» Class1), а затем просто объявить любые неиспользуемые значения в Class2 некоторым указанным значениям, означающим, что они не используются.

2) Я даже не совсем уверен, правильна ли эта техника, но определенно есть что-то в этом роде, что сработает: объявить указатель типа Void *.вам также нужно будет определить ptr1 и ptr2, чтобы они указывали на типы Class1 и Class2 соответственно.вы захотите, чтобы указатель Void * действительно указывал на определяемый вами класс, а затем создал функцию для приведения этого указателя void * к типу ptr1 (указатель на тип Class1) или ptr (указатель на тип Class2).

это очень похоже на создание void * (указателя на тип void), а затем приведение его к целому числу, если в вашей ячейке памяти действительно есть целые числа.затем вы можете рассматривать это приведение как указатель на целое число.

наконец, вы говорите «указатель [2] .a = 1.0» и «указатель [4] .d = 10.0» в вашем примере.Вы создаете массив классов?если вы хотите, чтобы указатель указывал на один класс, то вы в конечном итоге будете использовать «pointer.a» и «pointer.d», верно?

0 голосов
/ 04 октября 2011

Если ваш Class2 фактически получен из Class1, вы можете иметь массив Class1*.Если нет, то я бы основал Class1 и Class2 на общем базовом классе и имел бы массив BaseClass*.

Конечно, вам нужен какой-то способ узнать, что на самом делесодержимое записи (что лучше сделать в C ++ с виртуальными функциями, если применимо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...