Могу ли я иметь массив целых чисел для одного конструктора и одно целое число для другого конструктора? - PullRequest
1 голос
/ 28 марта 2011

Разрешены ли следующие конструкторы в одном классе IntList?

IntList(int length);
IntList(int data[]);

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Это нормально, но обратите внимание, что последний такой же, как int* data, который является указателем, а не массивом.

Массивы не подлежат копированию и должны передаваться по ссылке:

typedef int array_type[5];

IntList(const array_type& arr); // same as: IntList(const int (&arr)[5]);

Вы также можете взять массив любого размера, используя шаблоны:

template <std::size_t N>
IntList(const int (&arr)[N]); // N is the number of elements

Но ваш подход в конечном итоге неортодоксален. Если вы хотите инициализировать с диапазоном данных, используйте итераторы:

template <typename InputIterator>
IntList(InputIterator begin, InputIterator end);

Теперь вы можете выполнять итерации от begin до end, которые могут быть итераторами из любого типа контейнера, например массивов, std::vector, std::map и т. Д.

Но вы все равно должны использовать std::vector<int> вместо IntList.

1 голос
/ 28 марта 2011

Да, это разные типы, так что это действительно.

0 голосов
/ 28 марта 2011
IntList(int length);
IntList(int data[]);

Как бы то ни было, этот метод нельзя использовать в качестве другого метода.

IntList(int* data);  // Error: This is equivalent to IntList(int data[])
                     // Because an array decays to a pointer.

Оба аргумента разные. length имеет тип int, а data имеет тип int[] и является примером перегрузки конструктора .


После вашего комментария о том, как его использовать - это должно служить примером

class IntList
{
    int member[5] ;  // Added
    public:
       IntList(int length) ;
       IntList( int data[] )  // Should make sure that the passed array size is 5
                              // or take another argument mentioning the size of
                              // array being passed.
       {
           for(int i=0; i<5; ++i)
               member[i] = data[i] ;
       }
} ;


int a[] = { 1,2,3,4,5 };   // Making sure that array size is 5
IntList obj(a) ; // Array decays to a pointer pointing to first index of the array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...