digitalmars.D.learn - override toString
- Qian Xu (25/25) Dec 03 2009 Hi All,
- Michal Minich (6/35) Dec 03 2009 use typeof(this).classinfo.name to get type of A. "this" returns runtime...
- Qian Xu (2/6) Dec 03 2009 sorry, it was my type error. the code is not real ^^)
- Max Samukha (28/53) Dec 03 2009 this.classinfo can be seen as a virtual function returning the
- Qian Xu (2/9) Dec 03 2009 Thanks. You made my day
Hi All, I want to print some object information for debugging. But the name of class is incorrect. I do not know why. module test; class A { char[] data; public char[] toString() { return "<" + this.classinfo.name + ": " + data + ">"; } } class B: A { char[] data2; public override char[] toString() { return "<" + this.classinfo.name + ": " + super.toString + ", " + data2 + ">"; } } auto b = new B; b.data = "hello"; b.data2 = "world"; Cout(b.toString); // <test.B: <test.B: hello>, world> The expected result should be: <test.B: <test.A: hello>, world> But the actual result is: <test.B: <test.B: hello>, world>
Dec 03 2009
Hello Qian,Hi All, I want to print some object information for debugging. But the name of class is incorrect. I do not know why. module test; class A { char[] data; public char[] toString() { return "<" + this.classinfo.name + ": " + data + ">"; } } class B: A { char[] data2; public override char[] toString() { return "<" + this.classinfo.name + ": " + super.toString + ", " + data2 + ">"; } } auto b = new B; b.data = "hello"; b.data2 = "world"; Cout(b.toString); // <test.B: <test.B: hello>, world> The expected result should be: <test.B: <test.A: hello>, world> But the actual result is: <test.B: <test.B: hello>, world>use typeof(this).classinfo.name to get type of A. "this" returns runtime type of instance, "typeof(this)" return static type. http://www.digitalmars.com/d/1.0/expression.html btw. I noticed that you are using "+" for string concatenation, how is possible that your program even comiples??? "~" should be used for string concatenation.
Dec 03 2009
Michal Minich wrote:btw. I noticed that you are using "+" for string concatenation, how is possible that your program even comiples??? "~" should be used for string concatenation.sorry, it was my type error. the code is not real ^^)
Dec 03 2009
On Thu, 03 Dec 2009 11:01:29 +0100, Qian Xu <qian.xu funkwerk-itk.com> wrote:Hi All, I want to print some object information for debugging. But the name of class is incorrect. I do not know why. module test; class A { char[] data; public char[] toString() { return "<" + this.classinfo.name + ": " + data + ">"; } } class B: A { char[] data2; public override char[] toString() { return "<" + this.classinfo.name + ": " + super.toString + ", " + data2 + ">"; } } auto b = new B; b.data = "hello"; b.data2 = "world"; Cout(b.toString); // <test.B: <test.B: hello>, world> The expected result should be: <test.B: <test.A: hello>, world> But the actual result is: <test.B: <test.B: hello>, world>this.classinfo can be seen as a virtual function returning the classinfo for the actual class instance and typeof(this).classinfo - as a static function returning the classinfo of the compile-time type of this (that is the class where it is called). So, your example should be rewritten (D2): import std.stdio; class A { string data; public string toString() { return "<" ~ typeof(this).classinfo.name ~ ": " ~ data ~ ">"; } } class B: A { string data2; public override string toString() { return "<" ~ typeof(this).classinfo.name ~ ": " ~ super.toString ~ ", " ~ data2 ~ ">"; } } void main() { auto b = new B; b.data = "hello"; b.data2 = "world"; writeln(b.toString); }
Dec 03 2009
Max Samukha wrote:this.classinfo can be seen as a virtual function returning the classinfo for the actual class instance and typeof(this).classinfo - as a static function returning the classinfo of the compile-time type of this (that is the class where it is called). So, your example should be rewritten (D2):Thanks. You made my day
Dec 03 2009