2013-03-11 3 views
-1

Я пытаюсь создать массив объекта класса Point в объекте класса Polygon. При компиляции я получаю несколько ошибок, может ли кто-нибудь помочь мне исправить эти ошибки/предложить лучший способ создания массива объектов класса?Создать массив объекта класса

КОД УДАЛИТЬ

при попытке компиляции я получаю эти ошибки:

Undefined symbols for architecture x86_64: 
     "Point::MAX_VAL", referenced from: 
      Point::Point() in ccyVCyNB.o 
      Point::Point() in ccyVCyNB.o 
      Point::Point(float, float)in ccyVCyNB.o 
      Point::Point(float, float)in ccyVCyNB.o 
      Point::set(float, float)in ccyVCyNB.o 
      Point::setRange(float, float)in ccyVCyNB.o 
     "Point::MIN_VAL", referenced from: 
      Point::Point() in ccyVCyNB.o 
      Point::Point() in ccyVCyNB.o 
      Point::Point(float, float)in ccyVCyNB.o 
      Point::Point(float, float)in ccyVCyNB.o 
      Point::set(float, float)in ccyVCyNB.o 
      Point::setRange(float, float)in ccyVCyNB.o 
    ld: symbol(s) not found for architecture x86_64 
+2

Это поможет, если вы сможете перечислить ошибки, которые вы получаете, желательно неотредактированные и завершенные. Это помогло бы еще больше, если бы вы могли указать линии, о которых они говорят в предоставленном источнике. –

+0

У вас также есть другие проблемы, которые не связаны с компиляцией, но временем выполнения. В 'setPoints' вы должны сначала удалить существующий указатель и выделить новый массив. Или просто используйте 'std :: vector', поэтому вам не нужно беспокоиться о проблемах с памятью. –

ответ

1
Polygon::Polygon() 
{ 
    numPoints = 0; 
    points = new Point[numPoints]; 
} 

Вы выделение памяти для 0 объектов типа Point. Это проблема.

+2

Вполне нормально выделять нулевую память, если она не доступна (поскольку это будет за пределами границ). –

+0

Но использование конструктора по умолчанию, за которым следует вызов функции-члена 'setPoints', приводит к доступу к нераспределенной памяти. – uba

+0

Поскольку размер равен нулю, конструктор фактически не вызывается. Вы получаете действительный указатель, который нужно удалить, но не вызывается конструктор (или деструктор в 'delete []'). –

1

Причина ваших ошибок компиляции является MIN_VAL и MAX_VAL, которые вы объявляете, а затем инициализировать в конструкторах. Поэтому все ссылки на них не определены.

Рассмотрите возможность использования

class Point { 
... 
}; 

float Point::MIN_VAL = -10.0f; 
float Point::MAX_VAL = 10.0f; 

class Polygon { 
... 
}; 
+0

Где бы я ввел эти две строки кода? – Bob

+0

@Bob По размеру файла. Я редактировал свой образец, чтобы сделать его более ясным. – us2012

1

Вы должны действительно провести std::vector<Point> вместо массива:

class Polygon 
{ 
private: 
    int numPoints; 
    std::vector<Point> points; 
.... 
}; 

Тогда вам не придется беспокоиться о деструктор, конструктор копирования, или копирующий оператор присваивания , Это по умолчанию размер равен нулю, так что ваш конструктор по умолчанию становится

Polygon::Polygon() : numPoints(0) {} 

и это одна:

Polygon::Polygon(int numPoints, float xArray[], float yArray[]) 
{ 
    for(int i = 0; i < numPoints; i++) 
    { 
     points.push_back(Point(xValues[i], yValues[i])); 
    } 
} 

, но на самом деле, вам не нужно член numPoints данных, потому что вы можете получить количество точек от размера вектора, то есть points.size().

+0

Спасибо за предложение! Но я хотел бы узнать, как использовать массивы, прежде чем использовать вектор – Bob

Смежные вопросы