2014-10-23 1 views
0

В настоящее время я пытаюсь запрограммировать массив объектов в программе на C++. Однако он продолжает давать мне ошибки при попытке создания массивов. Так что на вершине моего кода у меня есть следующий код:Объявление силового массива C++ без указания параметров

#define sensNumber 4 
ros::Publisher pub_range2 [sensNumber]; 

это дает ошибку:

multisone2.ino:19:38: error: no matching function for call to ‘ros::Publisher::Publisher()’ 

Так он пытается вызвать конструктор для издателя, то почему? И как это остановить?

Теперь я знаю, что это также можно сделать с помощью векторов, но я пытаюсь оптимизировать код esp. для скорости чтения, поэтому я предпочел бы избегать векторов (да, я знаю, что он остается linair, но доступ к этому массиву представляет значительную часть моего кода).

+0

Это странно - согласно [документации] (http://docs.ros.org/hydro/api/roscpp/html/classros_1_1Publisher.html), 'ros :: Publisher' * имеет * общедоступный конструктор по умолчанию, так что это должно сработать. Возможно, вам не хватает чего-то другого. – molbdnilo

ответ

1

Как вы пытаетесь стек выделить sensNumber экземплярам ros::Publisher, конструктор по умолчанию должен называться.

Альтернативой было бы выделение массива указателей на ros::Publisher. Еще лучше, массив std::unique_ptr или std::shared_ptr.

+0

Можно ли также принудительно использовать один и тот же параметр во всех экземплярах, а затем изменить их на то, что я хочу? – Thijser

+0

Есть действительно способы (например, размещение нового, но, пожалуйста, забыть, я упомянул, что сразу после его чтения), но, действительно, вы должны использовать контейнер stl для этого. – Bathsheba

+0

Я прошу обоих, потому что я действительно хочу использовать его более «java-стиль», и потому что это работает на arduino, который не совсем способен обрабатывать то, что я делаю, поэтому я ищу ситуации, такие как указатели, которые не нужны быть указателями и тому подобное. – Thijser

1

Когда вы объявляете массив объектов C++, вы фактически создаете экземпляр каждого элемента. Это означает, что для каждого элемента массива вызывается конструктор без параметров. Если вы не хотите создавать экземпляры всех элементов при объявлении массива, вы должны объявить массив указателей вместо этого, а затем инициализировать каждый элемент, когда это необходимо.