Возникли проблемы с массивом указателей.
У меня есть собственный класс под названием С. 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)
Так что второй звонок был неверным. Спасибо за вашу помощь
Если оставить в стороне философию, это довольно красноречиво из вашего комментария (выделение добавлено):
«На самом деле я вызываю 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 ** в вашем содержавшемся объекте, тогда первый параметр правильный, а второй неверный.Если только ваш 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
) и отметьте, какой из них быстрее.
Если ваш тип содержит только double
Я предполагаю, что это будет намного быстрее не использовать указатели! Если объекты содержат std::string
или std::vector<T>
(на некоторое время T
) картина, вероятно, меняется, но по сравнению с перемещением структуры с одним или двумя основными объектами стоимость доступа к более или менее случайно распределенным данным довольно высока. Конечно, чтобы определить конкретную ситуацию, вам нужно профилировать оба подхода.