Перегрузка оператора Subscript [] в C ++ для установки размера класса (квантификатор). - PullRequest
1 голос
/ 13 октября 2011

Добрый день, ребята.

У меня есть следующая структура и класс,

template <class T>
struct Node
{
    T DataMember;
    Node* Next;
};

template <class T>
class NCA
{
    public:
        NCA();
        ~NCA();
        void push(T);
        T pop();
        void print();
        void Clear();
    private:
        Node<T>* Head;
        void* operator new(unsigned int);
};

Я хотел бы создать экземпляр класса с размером

т.е.NCA [30] как любой массив

Ответы [ 4 ]

6 голосов
/ 13 октября 2011

Вы не можете.Но вы можете сделать что-то вроде этого: инициализировать это скобками, но не скобками:

NCA<int> myList(30);

Реализуйте это так:

template <class T>
class NCA
{
  ...
  public:
    explicit NCA(std::size_t count);
  ...
 };

template <class T>
NCA<T>::NCA(std::size_t count) {
  ... allocate Head, &c ...
  while(count--)
    push(T());
}
5 голосов
/ 13 октября 2011

Если бы компилятор позволял вам использовать скобки в конструкторе объектов, как бы он узнал, пытались ли вы создать NCA размером 30 или массив из 30 NCA объектов? C ++ не позволяет вам переопределять синтаксис скобок, за исключением случаев, когда у вас уже есть объект.

3 голосов
/ 13 октября 2011

Это не совсем то, как operator[] работает.

Когда вы пишете NCA[30], вы пишете type[30], где для использования operator[] вам нужен экземпляр :

NCA inst;
inst[30];

Что вы можете сделать, это использовать целочисленный параметр шаблона для указания размера, например ::

#include <utility>

template <std::size_t N>
class NCA {
  char bytes[N];
};

int main() {
  NCA<1024> instance;
}
1 голос
/ 13 октября 2011

Вы не можете.

Вы можете использовать ctor только для того, чтобы сделать это следующим образом:

NCA n(30);
...