Инициализация класса объект-массив - PullRequest
0 голосов
/ 05 сентября 2011

Есть ли способ инициализировать массив следующим образом:

static const vec3d<long> XI[Q] = {
     vec3d<long>( 0, 0, 0 ),

 vec3d<long>(-1, 0, 0 ),  vec3d<long>( 0,-1, 0 ),  vec3d<long>( 0, 0,-1 ),
 vec3d<long>(-1,-1, 0 ),  vec3d<long>(-1, 1, 0 ),  vec3d<long>(-1, 0,-1 ), [etc]
};

, где

00039 template<typename TYPE>
00040 class vec3d : public vec<TYPE>{
00041 public:
00042 
00049         vec3d() : vec<TYPE>( 0, 3 ){};
00057         vec3d( TYPE right ) : vec<TYPE>( right, 3 ){};
00065         vec3d( TYPE X_val, TYPE Y_val, TYPE Z_val ) : vec<TYPE>( 0, 3 ){
00066                 this->val[0] = X_val;
00067                 this->val[1] = Y_val;
00068                 this->val[2] = Z_val;
00069         };
00077         vec3d( vec3d<TYPE>& right ) : vec<TYPE>( 0, 3 ){
00078                 this->val[0] = right[0];
00079                 this->val[1] = right[1];
00080                 this->val[2] = right[2];
00081         }; [etc] };

и

    00040 template<typename TYPE>
    00041 class vec{
    00042 public:
    00047         TYPE *val;
    00052         int dimension;
    00053 public:
    00060         vec();
    00066         vec( TYPE right );
    00073         vec( TYPE right, int _dimension );
    00081         vec( vec<TYPE> &right ); 
    00082 
    00087         ~vec();
    00088 
    00089 
    00090         TYPE& operator[]( int right);
    00091         vec<TYPE>& operator=( TYPE right );
    00092         vec<TYPE>& operator=( vec<TYPE> &right );
[etc] };

Источник:

00049 template<typename TYPE>
00050 vec<TYPE>::vec( TYPE right, int _dimension ){
00051         dimension = _dimension;
00052         val = new TYPE[_dimension];
00053         assert( val );
00054         for( int i = 0; i < dimension; i++ ) val[i] = right;
00055 
00056 };

00075 template<typename TYPE>
00076 TYPE& vec<TYPE>::operator[]( int right ){
00077         assert( ( right < dimension ) );
00078         assert( right >= 0 );
00079         assert( val );
00080         return val[right];
00081 };

являются конструкторами.Q объявлен как "static const int", поэтому он должен соответствовать стандарту C ++, чтобы быть неизменным, верно?

Компилятор говорит: ошибка: нет соответствующей функции для вызова 'albm :: vec3d :: vec3d (albm:: vec3d) 'vec3d.h: 77: 2: примечание: кандидаты: albm :: vec3d :: vec3d (albm :: vec3d &) [с TYPE = long int]

Очевидно, что есть проблема,что я не могу пройти vec3d & здесь.Есть ли обходной путь?Определение каждого вектора сначала кажется решением.Хотя было бы неприятно ...

И извините за мой глупый вопрос ... возможно, эта тема где-то существует, но я ее не нашел.Вероятно, у этой проблемы есть какое-то специальное имя, которого я не знаю - поэтому я не могу его погуглить!"расширенный список инициализаторов", "инициализация массива классов" и тому подобное не помогли ...

РЕШЕНИЕ: некоторая постобработка здесь ... может быть и так.else сталкивается с той же проблемой: конструктору копирования не хватает "const":

00077         vec3d( const vec3d<TYPE>& right ) : vec<TYPE>( 0, 3 ){
00078                 this->val[0] = right.val[0];
00079                 this->val[1] = right.val[1];
00080                 this->val[2] = right.val[2];

Кроме того, я не могу получить прямой доступ к right [] - моя причина по какой-то причине будет в стиле шаблона - но правильно.val [] добивается цели!

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

С учетом

00039 template<typename TYPE>
00040 class vec3d : public vec<TYPE>{
00041 public:
00042 
00049         vec3d() : vec<TYPE>( 0, 3 ){};
00057         vec3d( TYPE right ) : vec<TYPE>( right, 3 ){};
00065         vec3d( TYPE X_val, TYPE Y_val, TYPE Z_val ) : vec<TYPE>( 0, 3 ){
00066                 this->val[0] = X_val;
00067                 this->val[1] = Y_val;
00068                 this->val[2] = Z_val;
00069         };
00077         vec3d( vec3d<TYPE>& right ) : vec<TYPE>( 0, 3 ){
00078                 this->val[0] = right[0];
00079                 this->val[1] = right[1];
00080                 this->val[2] = right[2];
00081         }; [etc] };

конструктор копирования, определенный в строке 77, имеет аргумент не-const, который нельзя привязать к аргументу rvalue.

Просто удалите строки с 77 по 81.

Компилятор сгенерирует хороший конструктор копирования для вас.

Cheers & hth.,

0 голосов
/ 05 сентября 2011

Ваш конструктор копирования объявлен неправильно - параметр toCopyFrom должен быть const :

vec3d<TYPE>( const vec3d<TYPE>& toCopyFrom)

Редактировать:

Теперь о вашей второй проблеме, связанной соператор индекса:

Оператор индекса operator[]() в вашем базовом классе не имеет семантики const (т.е. только для чтения).В вашем конструкторе копирования вы пытались получить доступ к значениям в right через этот оператор индекса.Теперь этот параметр right объявлен как const, что означает, что вам не разрешено изменять внутреннее состояние right.Так как ваша operator[]() функция не является константой, язык предполагает, что функция может изменять / изменять состояние right, что противоречит константности right.Действительно, функция на самом деле возвращает ссылку на внутренние переменные-члены класса, что позволило бы клиенту этого кода изменить внутреннее состояние right!

. Решение заключается в предоставлении дополнительного, константногоПодстрочный оператор в базовом классе:

const TYPE& operator[]( int right) const

Примечание - лично я переименовал бы right в index - для ясности.

Трейлингconst в указанной выше сигнатуре функции обеспечивает семантику доступа к константам, что позволяет вам вызывать, например, x = right[n], когда right равно const.Ведущий const в возвращаемом типе просто означает, что возвращаемая ссылка TYPE будет const, что препятствует выполнению right[n] = x, когда right является const.Примечание. Когда вы добавляете функцию, ее реализация (тело) функции, вероятно, должна выглядеть так же, как и для существующего оператора индекса.Вы не предоставили это, поэтому я не могу написать это.

В заключение я бы предложил вам прочитать темы const и const-правильности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...