C ++ массив указателей — инициализация и доступ к объектам

Возникли проблемы с массивом указателей.
У меня есть собственный класс под названием С. C имеет переменную двойной с1. Я должен отсортировать массив C-s по c1, используя собственный алгоритм сортировки. Я предполагаю, что, поскольку мне нужно перемещать объекты в массиве, было бы гораздо эффективнее просто перемещать указатели на объекты, поэтому я должен использовать не массив объектов, а массив указателей на объекты.

Я инициализировал массив так:

C** someC;
someC = new C*[size];
for(int i = 0; i < size; i++) {
// a and b are of type CPoint
someC[i] = new C(a,b);
}

Я правильно делаю эту часть? Это вызов объектов C, который затем вызывает проблемы:

someC[i]->a.x

дает мне ошибку: слева от ‘-> a’ должен указывать на класс / структура / объединение / универсальный тип

Я новичок в C ++, поэтому я могу упустить что-то очевидное, но я провел некоторое исследование и ничего не нашел. Может быть, я плохо понимаю, как работают указатели …


ОБНОВИТЬ

Заголовочный файл класса C:

#pragma once

class C
{
public:
CPoint a;
CPoint b;
double c1;
C(void);
C(CPoint,CPoint);
~C(void);
};

реализация:

#include "StdAfx.h"#include "C.h"#include <math.h>

C::C(void)
{
}

C::C(CPoint a, CPoint b)
{
this->a=a;
this->b=b;

double c1_x = a.x - b.x;
double c1_y = a.y - b.y;
c1= sqrt( (c1_x * c1_x) + (c1_y * c1_y));
}

C::~C(void)
{
}

ОБНОВИТЬ

Проблема была в коде, который я предоставил в комментариях, я не заметил, что я неправильно вызывал массив, как это:

pDC->MoveTo(someC[i]->a.x, someC->a.y)

Так что второй звонок был неверным. Спасибо за вашу помощь

1

Решение

Если оставить в стороне философию, это довольно красноречиво из вашего комментария (выделение добавлено):

«На самом деле я вызываю someC в методе OnDraw следующим образом: pDC->MoveTo(someC[i]->a.x, someC->a.y); someC определяется как public в заголовочном файле «

В частности, это в вашем списке параметров:

someC[i]->a.x, someC->a.y

Это говорит мне один из них неправильный. Судя по вашей ошибке, я пойду с первой. Это укрепило бы это, если бы мы могли видеть определение вашего объекта, который реализует OnDraw() и где именно так это становится someC от.

  • Если someC это C* в вашем содержащем объекте второй параметр верен, первый неверен.
  • Если someC является C ** в вашем содержавшемся объекте, тогда первый параметр правильный, а второй неверный.
2

Другие решения

Если только ваш C объекты действительно очень дороги для копирования конструкции, не беспокойтесь о реализации вашего собственного алгоритма сортировки, но определяйте строгий общий порядок по C:

bool operator<(C const& lhs, C const& rhs) {
return lhs.c1 < rhs.c1;
}

и использовать std::sort на std::vector<C>. Если вы беспокоитесь о копировании конструкции, вы также можете напрямую использовать std::set<C> который автоматически сортирует себя, без Копировать конструкцию.


После вашего редактирования: ваш C кажется относительно маленьким и легко копируемым, но это граница; Лучше всего дать оба подхода (set а также vector) и отметьте, какой из них быстрее.

2

Если ваш тип содержит только double Я предполагаю, что это будет намного быстрее не использовать указатели! Если объекты содержат std::string или std::vector<T> (на некоторое время T) картина, вероятно, меняется, но по сравнению с перемещением структуры с одним или двумя основными объектами стоимость доступа к более или менее случайно распределенным данным довольно высока. Конечно, чтобы определить конкретную ситуацию, вам нужно профилировать оба подхода.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector