New With Struct and Getting Class Object Pointers
Alex
sascha.orlov at gmail.com
Sun Sep 30 10:28:25 UTC 2018
On Sunday, 30 September 2018 at 09:30:38 UTC, Vijay Nayar wrote:
> Is there a way to either have a constant reference to a class
> that can be set to a new value, or is there a way to convert
> the class variable to a class pointer?
>
> For example:
>
> void main()
> {
> class Thing {}
> class ThingSaver {
> // A const(Thing) could not be changed in
> setThing().
> const(Thing)* t;
>
> void setThing(in Thing thing) {
> t = thing; // ERROR converting to pointer type!
> }
> const(Thing) getThing() const {
> return *t;
> }
> }
>
> Thing t1 = new Thing();
>
> ThingSaver saver = new ThingSaver();
> saver.setThing(t1);
> const(Thing) t2 = saver.getThing();
> }
I think, what you are facing here, is the different notion of
const, as used from C++. The reasoning about it is described for
example here:
http://jmdavisprog.com/articles/why-const-sucks.html
Jonathan is much better therein as I am.
However, there are approaches to solve what you want to do. For
example, there is a Rebindable around:
https://dlang.org/library/std/typecons/rebindable.html
´´´
import std.stdio;
import std.typecons;
void main()
{
class Thing {int dummy; }
class ThingSaver {
/*
A const(Thing) could not be changed in setThing(),
but a Rebindable can be reassigned, keeping t const.
*/
Rebindable!(const Thing) t;
void setThing(in Thing thing) {
t = thing; // No pointers in use :)
}
const(Thing) getThing() const {
return t;
}
}
Thing t1 = new Thing();
ThingSaver saver = new ThingSaver();
saver.setThing(t1);
//saver.t.dummy = 5; fails as expected.
const(Thing) t2 = saver.getThing();
}
´´´
I hope, I got your idea right...
More information about the Digitalmars-d-learn
mailing list