Как объявить массив объектов внутри своего класса?

Я не уверен, как создать массив объектов в своем собственном классе. Например:

class A { 
public:
  const static int MAX_SIZE = 10;

 private:
  A arrayOfOBjects[MAX_SIZE];


}

Я получаю сообщение об ошибке: «Теперь разрешен неполный тип». Как мне это сделать? Если я объявлю массив объектов из другого класса внутри класса А, он будет работать. Но как мне создать массив объектов в своем собственном классе?


person Emmett    schedule 26.05.2013    source источник
comment
Класс не может содержать членов своего собственного типа. Вам нужно будет хранить массив интеллектуальных указателей на A.   -  person juanchopanza    schedule 26.05.2013
comment
Посмотрите на это: stackoverflow.com/q/16756876/2040040   -  person johnchen902    schedule 26.05.2013
comment
@juanchopanza А как насчет std::array<A, MAX_SIZE>?   -  person Peter Wood    schedule 26.05.2013
comment
@PeterWood, это тоже не должно работать. Но std::vector<A> мог.   -  person juanchopanza    schedule 26.05.2013
comment
@juanchopanza Ах, это неполный тип. Да, vector сработает.   -  person Peter Wood    schedule 26.05.2013
comment
@ПитерВуд правильно. std::array создает те же проблемы, что и стандартный массив C фиксированного размера, что является той же проблемой, что и наличие одного члена данных типа A в A. std::vector не имеет этой проблемы, потому что он динамически выделяет A объекты и не нуждается в полном типе A (хотя я уверен, что это не работало в старых компиляторах, которые я использовал).   -  person juanchopanza    schedule 26.05.2013
comment
@juanchopanza Да, некоторые компиляторы не работали, в том числе для пары ключ/значение map. Я всегда думал, что это была дырявая деталь реализации. Почему array нельзя реализовать как vector?   -  person Peter Wood    schedule 26.05.2013
comment
@PeterWood, потому что std::array является заменой массива C фиксированного размера без накладных расходов, поэтому все данные, которые он содержит, являются его элементами. У него не может быть указателя, указывающего на некоторую динамически выделенную память.   -  person juanchopanza    schedule 26.05.2013


Ответы (3)


используйте указатель. или shared_ptr и т. д. и динамически распределять объекты

class A { 
public:
  const static int MAX_SIZE = 10;

 private:
  A * arrayOfOBjects[MAX_SIZE];


}
person Serve Laurijssen    schedule 26.05.2013
comment
Где вы видите требование для семантики совместного владения? - person Captain Obvlious; 26.05.2013

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

По той же причине нельзя содержать несколько. Может быть, вы имели в виду, что массив является статическим элементом, который не добавляется к состоянию одного экземпляра?

person Balog Pal    schedule 26.05.2013

Используя указатели, вы можете решить эту проблему

class A { 
public:
  const static int MAX_SIZE = 10;
  void allocate(){
     arrayOfOBjects=new A[MAX_SIZE];
  }
 private:
  A *arrayOfOBjects;
};

Вы можете использовать это следующим образом

A a;
a.allocate();
person apm    schedule 01.07.2015