2011-09-05 166 views
0

有一种方法来初始化一个数组,像这样:初始化类对象阵列

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 &)[with TYPE = long int]

显然有问题,我不能在这里通过vec3d &。有一些解决方法吗?首先定义每个单独的载体似乎是一个解决方案。虽然是一个谜题...

对不起,我的愚蠢问题......也许这个线程存在某处,但我没有找到它。可能这个问题有一些我不知道的特殊名字 - 因此我不能谷歌它! “扩展初始化列表”,“一流的数组初始化”和这样的没有做的伎俩......

SOLUTION:一些后处理在这里...也许如此。其他遭遇相同的概率: 拷贝构造函数缺乏一个“常量”:

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 []是诀窍!

+0

发布*最小*和*完整*代码示例。 –

+0

编辑:希望这有助于? – 0815ZED

回答

0

你的拷贝构造函数没有正确地宣布 - 的toCopyFrom参数需要常量

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

编辑:现在

,在您对下标操作符第二个问题:

基类中的下标运算符operator[]()没有const(即只读)语义。在您的拷贝构造函数中,您试图通过该下标运算符访问right中的值。现在,right参数被声明为const,这基本上意味着您不允许更改right的内部状态。由于您的operator[]()函数不是常量,因此该语言的假设是函数可以改变/更改right的状态 - 这与right的常量冲突。事实上,该函数实际上会返回对类的内部成员变量的引用,这将允许该代码的客户端更改right的内部状态!

的解决方案是在基类中提供额外的,常量,下标操作:

const TYPE& operator[](int right) const 

注 - 就个人而言,我会重新命名rightindex - 为清楚起见。

的上述函数签名后const为它提供常量访问语义,它可调用 - 例如 - X = right[n]rightconst。返回类型的前导const仅仅意味着返回的TYPE引用将是const,这会阻止您在right为常量时执行right[n] = x。注意 - 添加函数时,函数的实现(主体)应该看起来与现有的下标运算符相同。你没有提供,所以我不能写。

总之,我建议你阅读const和'const-correctness'主题。

+0

好的,谢谢。但现在我得到了 – 0815ZED

+0

vec3d.h:78:3:错误:将'const albm :: vec3d '作为'TYPE'和albm :: vec :: operator [](int) = long int]'丢弃限定符 – 0815ZED

+0

我想你可能需要发布更多的代码,特别是包含operator []()成员函数。 –

1

鉴于

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

现在它抱怨:没有匹配函数调用'albm :: vec3d :: vec3d(albm :: vec3d )' – 0815ZED