Хочу написать конструктор класса, который в качестве параметра принимает статический массив (указатель на 1 элемент) и инициализирует вектор внутри класса этим массивом:
class A
{
public:
explicit A(int x[]):v(x,x+sizeof(x)/sizeof(*x)) {} // или (int* x)
private:
vector
Не работает... В чём проблема?
Ответ
Параметр вашего конструктора имеет тип int *. Поэтому выражение
sizeof(x)/sizeof(*x)
эквивалентно выражению
sizeof( int * )/sizeof( int )
И может равняться либо 2, если размер указателя равен, например, 8 байтам, а размер объекта типа int равен 4 байтам, либо 1, если данные размеры совпадают.
Лучше объявить два перегруженных конструктора.
Первый конструктор может быть определен как
A( const int *first, const int *last ) : v( first, last ) {}
а второй конструктор может быть определен либо как
A( const int *first, size_t n ) : v( first, first + n ) {}
либо использовать делегирующий конструктор
A( const int *first, size_t n ) : A( first, first + n ) {}
Также вы можете объявить шаблонный конструктор, как, например,
template
Вот демонстрационная программа, в которой показаны все три способа вызова конструкторов класса
#include
struct A
{
A( const int *first, const int *last ) : v( first, last ) {}
A( const int *first, size_t n ) : v( first, first + n ) {}
template
std::vector
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
A a1( a, a + sizeof( a ) / sizeof( *a ) );
for ( int x : a1.v ) std::cout << x << ' ';
std::cout << std::endl;
A a2( a, sizeof( a ) / sizeof( *a ) );
for ( int x : a1.v ) std::cout << x << ' ';
std::cout << std::endl;
A a3( a );
for ( int x : a1.v ) std::cout << x << ' ';
std::cout << std::endl;
}
Ее вывод на консоль
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
Комментариев нет:
Отправить комментарий