digitalmars.D.learn - Changing the class data underneath some reference
- David Colson (21/21) Nov 29 2017 Hello all!
- David Colson (15/36) Nov 29 2017 I made an example demonstrating what I'd do in C++:
- codephantom (10/31) Nov 29 2017 void main()
- codephantom (6/7) Nov 29 2017 sorry, don't know how the int * got in there ;-)
- Steven Schveighoffer (8/38) Nov 29 2017 D does not support reassigning class data using assignment operator,
- Jonathan M Davis (11/53) Nov 29 2017 With classes, you could also assign the entire state of the object simil...
- Steven Schveighoffer (5/10) Nov 29 2017 It's mostly a bad idea. The whole point of disallowing assignment is to
- A Guy With a Question (7/28) Nov 29 2017 You are dealing with a reference type. Reference types can be
Hello all! I'm getting settled into D and I came into a problem. A code sample shows it best: class SomeType { string text; this(string input) {text = input;} } void main() { SomeType foo = new SomeType("Hello"); SomeType bar = foo; foo = new SomeType("World"); writeln(bar.text); // Prints hello // I'd like it to print World } In the C++ world I could do this using pointers and changing the data underneath a given pointer, but I can't use pointers in D, so I'm not sure how I can get this behaviour? I'd be open to other ways of achieving the same affect in D, using more D like methods.
Nov 29 2017
On Thursday, 30 November 2017 at 00:40:51 UTC, David Colson wrote:Hello all! I'm getting settled into D and I came into a problem. A code sample shows it best: class SomeType { string text; this(string input) {text = input;} } void main() { SomeType foo = new SomeType("Hello"); SomeType bar = foo; foo = new SomeType("World"); writeln(bar.text); // Prints hello // I'd like it to print World } In the C++ world I could do this using pointers and changing the data underneath a given pointer, but I can't use pointers in D, so I'm not sure how I can get this behaviour? I'd be open to other ways of achieving the same affect in D, using more D like methods.I made an example demonstrating what I'd do in C++: class SomeType { public: std::string text; SomeType(std::string input) {text = input;} }; int main() { SomeType foo = SomeType("Hello"); SomeType* bar = &foo; foo = SomeType("World"); std::cout << bar->text << "\n"; // Prints World }
Nov 29 2017
On Thursday, 30 November 2017 at 00:40:51 UTC, David Colson wrote:Hello all! I'm getting settled into D and I came into a problem. A code sample shows it best: class SomeType { string text; this(string input) {text = input;} } void main() { SomeType foo = new SomeType("Hello"); SomeType bar = foo; foo = new SomeType("World"); writeln(bar.text); // Prints hello // I'd like it to print World } In the C++ world I could do this using pointers and changing the data underneath a given pointer, but I can't use pointers in D, so I'm not sure how I can get this behaviour? I'd be open to other ways of achieving the same affect in D, using more D like methods.void main() { SomeType foo = new SomeType("Hello"); int * ptr; SomeType * bar; bar = &foo; foo = new SomeType("World"); writeln(bar.text); // Prints World }
Nov 29 2017
On Thursday, 30 November 2017 at 00:52:25 UTC, codephantom wrote:...sorry, don't know how the int * got in there ;-) Anyway..who said you can't use pointers in D? Just change: //SomeType bar = foo; SomeType * bar = &foo;
Nov 29 2017
On 11/29/17 7:40 PM, David Colson wrote:Hello all! I'm getting settled into D and I came into a problem. A code sample shows it best: class SomeType { string text; this(string input) {text = input;} } void main() { SomeType foo = new SomeType("Hello"); SomeType bar = foo; foo = new SomeType("World"); writeln(bar.text); // Prints hello // I'd like it to print World } In the C++ world I could do this using pointers and changing the data underneath a given pointer, but I can't use pointers in D, so I'm not sure how I can get this behaviour? I'd be open to other ways of achieving the same affect in D, using more D like methods.D does not support reassigning class data using assignment operator, only the class reference. You can change the fields individually if you need to. e.g.: foo.text = "World"; structs are value types in D and will behave similar to C++ classes/structs. -Steve
Nov 29 2017
On Wednesday, November 29, 2017 21:12:58 Steven Schveighoffer via Digitalmars-d-learn wrote:On 11/29/17 7:40 PM, David Colson wrote:With classes, you could also assign the entire state of the object similar to what you'd get with structs and opAssign, but you'd have to write a member function to do it. There's no reason that you couldn't do the equivalent of opAssign. It's just that there's no built-in operator for it. So, whatever member function you wrote for it would be non-standard. Heck, technically, we don't even have a standard way to clone a class object like function; either way, there's nothing built-in or standard for it. - Jonathan M DavisHello all! I'm getting settled into D and I came into a problem. A code sample shows it best: class SomeType { string text; this(string input) {text = input;} } void main() { SomeType foo = new SomeType("Hello"); SomeType bar = foo; foo = new SomeType("World"); writeln(bar.text); // Prints hello // I'd like it to print World } In the C++ world I could do this using pointers and changing the data underneath a given pointer, but I can't use pointers in D, so I'm not sure how I can get this behaviour? I'd be open to other ways of achieving the same affect in D, using more D like methods.D does not support reassigning class data using assignment operator, only the class reference. You can change the fields individually if you need to. e.g.: foo.text = "World"; structs are value types in D and will behave similar to C++ classes/structs.
Nov 29 2017
On 11/29/17 10:22 PM, Jonathan M Davis wrote:With classes, you could also assign the entire state of the object similar to what you'd get with structs and opAssign, but you'd have to write a member function to do it. There's no reason that you couldn't do the equivalent of opAssign. It's just that there's no built-in operator for it. So, whatever member function you wrote for it would be non-standard.It's mostly a bad idea. The whole point of disallowing assignment is to prevent the slicing problem. It's also why opAssign isn't overloadable for classes assigning to classes in the same hierarchy. -Steve
Nov 29 2017
On Thursday, 30 November 2017 at 00:40:51 UTC, David Colson wrote:Hello all! I'm getting settled into D and I came into a problem. A code sample shows it best: class SomeType { string text; this(string input) {text = input;} } void main() { SomeType foo = new SomeType("Hello"); SomeType bar = foo; foo = new SomeType("World"); writeln(bar.text); // Prints hello // I'd like it to print World } In the C++ world I could do this using pointers and changing the data underneath a given pointer, but I can't use pointers in D, so I'm not sure how I can get this behaviour? I'd be open to other ways of achieving the same affect in D, using more D like methods.You are dealing with a reference type. Reference types can be though of as a value type of an address. The new operator can be though of as giving the variable a new address. This means the foo and bar variables are not bound to the same value because their referencing different address. You need a struct. Which isn't a reference.
Nov 29 2017