如何使类或结构的名字可以返回值?
player7
2007-03-26
比如:
myClass var; var=1; // 这个可以通过重载运算符=实现 var=var+3; //同上 printf("var=%d",var); // ???? 怎么实现??? |
|
qiezi
2007-03-26
加个转换方法吧,这样用你自己也不会太放心吧?
printf("var=%d", var.to_i); |
|
oldrev
2007-03-26
> 如何使类或结构的名字可以返回值
你搞错了吧,是不是要问“如何使对象的名字返回值”? 结构的名字可以返回值是可以实现的,重载 static opCall 即可 > printf("var=%d",var); // ???? 怎么实现??? 这是一个 C函数,也不是模板,编译时 printf 并不知道 var 的类型,只能在运行时根据 %d 提供的类型处理。C++有重载用户自定义类型转换,但是会引起很多问题,一般不推荐使用。 |
|
jinheking
2007-04-02
char[] toString(){}
这个可能可以实现你的功能 |
|
player7
2007-04-03
我的目的就是想做一个自己的INT型,并且能有赋值检查功能,并且和原始的INT型无差别...
void main(){ myint!(int) v; v=12; // int k=test(v); //这句通不过编译,function r1.test (int) does not match parameter types (myint!(int) ) printf("v=%d",v); //这句没问题,能输出12 } struct myint(T){ T opAssign(T a){return v=a;} T opCall(){return this.v;} private: T v; } int test(int t){return t+13;} |
|
oldrev
2007-04-03
前面的回复我已经说了
printf("v=%d",v); //这句没问题,能输出12 这行能正确输出是巧合,因为 struct myint!(int) 刚好只有一个int成员 第4行通不过编译是因为myint!(int)这个类型不是 int,这是C++/D/C#的 基本常识 |
|
player7
2007-04-03
int k=test(v);
V当然不是INT型,但这里实际应该调用的是V() ,而V()应该可以简写成V的嘛. 当写成: int k=test(v()); //正确 或者: int v(){return 12;} int k=test(v); //也行,当一个函数没有参数,可以省略括号. 现在的问题是:当V是某结构的方法时,似乎就不能省略括号了??? |
|
achun
2007-04-03
哦,看出来了,D语言这种表面上语法的智能,
其实不可取呀,也就是说隐式的类型转换 这种特性要不得呀! 如果D不改变这一点的话......... 我用的时候会产生心里压力的. |
|
oldrev
2007-04-03
opCall 本身就说明了是重载 ()的,肯定不能省略(),否则就变成隐式类型转换了
用户自定义的隐式类型转换非常危险,More Effective C++ 第五条对此有详细解释 |