2014-11-25 2 views
0

Я создал класс, который ссылаться на некоторые элементы, как смарт-указатели, я хочу, чтобы создать массив этого класса, но я получаю различные типы ошибокКак создать массив интеллектуальных указателей?

class ConnectionType : public SimpleRefCount<ConnectionType> { 
public: 
    Ptr<Socket> txMstrSocPtr; /// Pointer to Master tx socket 
    Ptr<Socket> rxMstrSocPtr; /// Pointer to Master rx socket 
    Ptr<Socket> txSlavSocPtr; /// Pointer to Slave tx socket 
    Ptr<Socket> rxSlavSocPtr; /// Pointer to Slave rx socket 

    //ConnectionType(); 
    //~ConnectionType(); 

    void rxMstrCallBack(Ptr<Socket> socket); 
    void rxSlavCallBack(Ptr<Socket> socket); 
}; 

Ptr<ConnectionType> ConnectionArray[NUMBER_OF_CONNECTIONS] = CreateObject<ConnectionType>(); 

это дает мне ошибки Ошибка 1 ошибка C2075: ' ConnectionArray»: инициализация массива нуждается в фигурных скобках
2 IntelliSense: инициализация с„{...}“ожидается агрегатного объекта

+0

Вы не можете вернуть массив. Вы можете вернуть вектор > '. – Barry

+0

Можете ли вы написать его подробно (полный синтаксис), Извините, что я новичок в этой области. – Fouda

ответ

2

Если вы знаете, количество соединений, которые будут возвращены CreateObject во время компиляции (т.е. NUMBER_OF_CONNECTIONS - постоянная времени компиляции), вы можете использовать std::array< Ptr<ConnectionType>, NUMBER_OF_CONNECTIONS >. std::array моделирует основной массив, наиболее тесно связанный со стандартными контейнерами, и предпочитает использовать необработанные массивы при написании современного C++. Если NUMBER_OF_CONNECTIONS имеет размер, определенный во время выполнения, вы можете использовать std::vector< Ptr<ConnectionType> >. Меняем либо

#include <array> 
... 
std::array< Ptr<ConnectionType>, NUMBER_OF_CONNECTIONS > ConnectionArray{ CreateObject<ConnectionType>() }; 

или

#include <vector> 
... 
std::vector< Ptr<ConnectionType> > ConnectionArray{ CreateObject<ConnectionType>() }; 

Кроме того, если вы не были уже осведомлены, 11 добавлена ​​поддержка C++ для трех разновидностей стандартных смарт-указатели: unique_ptr, shared_ptr и weak_ptr (они отличаются своей семантикой владения), которые вы, возможно, предпочтете использовать над своими собственными интеллектуальными указателями, если они соответствуют вашим потребностям, и вы можете использовать компилятор, который их реализует.

+0

Спасибо, но когда я использую массив, он дает ошибку, что он ожидает ';' после ConnectionArray в std :: array , NUMBER_OF_CONNECTIONS> ConnectionArray {CreateObject ()}; – Fouda

+0

@Fouda Заменяя ваш класс Ptr стандартным умным указателем, выбирая класс ConnectionType и меняя синтаксис инициализации, выполните следующие компиляции: http://ideone.com/eOFc0K – bpw1621

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