Lyt
posts - 16,comments - 61,trackbacks - 0

今天看msdn不小心瞄到C#的动态多维数组,忍不住流口水,如果自己也有一个该有多好,于是就开始动手凑。

刚开始被如何定义动态多维数组给卡住,我希望用起来像这样:

Array<int> LytArray(321);   //以下代码相当于定义了int[3][2][1];

可是构造函数的参数个数在使用前无法确定,难道要写很多个构造函数,于是想了个办法,把构造函数的参数单独拿出来做手脚,并为此暗暗兴奋=  =

    class ArrayDimension
    {
    
public:
        
int Data[MAX_ARRAY];
        
int Dimension;

        ArrayDimension(
const int index);
        ArrayDimension
& operator,(const int index);
    };


    template
<typename _Type>
    
class Array
    {
    
private:
        AutoPtr
<_Type> Data;
        ArrayDimension DimensionInfo;

    
public:
        Array(
const ArrayDimension Info);
    };

我以为在编译Array<int> LytArray(3, 2, 1)时,3会用ArrayDimension来解释,然后通过重载逗号来解决不知道有多少个参数的问题,事实上失败了T_T:

error C2661: 'Lyt::Array<_Type>::Array' : no overloaded function takes 3 arguments 

具体为什么不给编译,其实我不怎么明白,仅以此文记录一时的胡思乱想,欢迎各位来喷~
posted on 2009-10-11 21:35 Lyt 阅读(1828) 评论(14)  编辑 收藏 引用 所属分类: 数据结构

FeedBack:
# re: 很傻很天真之Array
2009-10-12 00:48 | 空明流转
没什么喷的。。。编译器直接把你咔嚓了。。。
你要是Array(ArrayDimension(3),2,1)
说不定就成了。  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 09:19 | Kevin Lynx
- -|
重载逗号运算符,不会改变函数中逗号的语义。 - -!
是用于改变逗号表达式中逗号的语义,如:
ArrayDimension a;
a, 1; //逗号表达式
标准的逗号表达式其实还应该有个返回值。如:
class Test
{
public:
Test( int i ) : index( i )
{
}

const Test &operator, ( const Test &other )
{
return *this;
}

private:
int index;
};

Test a( 1 ), b( 2 ), c( 3 );
c = a, b;

不懂C#里的动态多维数组,所以对你这里的需求不作评论。:)
如果要支持不定个数的参数,要么使用C里的...(如printf),要么重载很多版本,即使模板也无法解决这个问题。如果太懒不想写那么多重载版本,可以考虑用宏自动生成这些代码。  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 09:41 | 暗涌
重载逗号。。。。More Effective C++上说,重载这些不推荐重载的操作符,很难得到预期的行为。。。  回复  更多评论
  
# re: 很傻很天真之Array[未登录]
2009-10-12 10:44 | goteet
可变参数
<stdarg.h>  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 11:07 | 陈梓瀚(vczh)
你应该这样:
/*NewArray是一个全局变量*/
Array<int, 3> arrays=NewArray[3][4][5];  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 11:35 | 溪流
这样能过:

class ArrayDimension
{
public:
int Data[MAX_ARRAY];
int Dimension;

ArrayDimension();
ArrayDimension(const int index);
ArrayDimension(const ArrayDimension &that);
ArrayDimension& operator,(const int index);
};


template<typename _Type>
class Array
{
private:
ArrayDimension DimensionInfo;

public:
Array(const ArrayDimension Info);
};

Array<int> arr((3, 2, 1));  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 12:38 | 陈梓瀚(vczh)
@溪流
把dimension放到template里面可以有以下效果:
Array<int, 3>::operator[]返回Array<int, 2>
Array<int, 2>::operator[]返回Array<int, 1>
Array<int, 1>::operator[]返回int

放到构造函数里面想达到这个效果是很麻烦的,而且把一个3维的数组赋值给2维是一件不能接受的事情。  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 13:02 | 溪流
@陈梓瀚(vczh)

嗯!这个方法不错!  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 17:34 | 欲三更
@陈梓瀚(vczh)
模板参数只能是常量的前提下, 这样搞和 intArray[3][4][5];有啥区别?  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 18:21 | 陈梓瀚(vczh)
@欲三更
不用常数,你想operator[]的返回类型是什么啊?  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 18:22 | 陈梓瀚(vczh)
@欲三更
我这里的常数指的是维度,当然跟尺寸是没关系的  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 20:09 | Lyt
@空明流转
这样写不顺眼唉,而且是行不通的,我昨晚试过…  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 20:11 | Lyt
@暗涌
我知道最好别重载逗号,可是我也没希望他到底先算哪个表达式,这样还有差么?  回复  更多评论
  
# re: 很傻很天真之Array
2009-10-12 21:46 | 欲三更
@陈梓瀚(vczh)
哦, 你说的是对的, 中看走眼了, 看见123就下意识的一位是尺度.  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理