www.digitalmars.com         C & C++   DMDScript  

D - Struct and operator overloading

reply ssuukk <ssuukk .go2.pl> writes:
Sometime ago someone suggested that to make a vector that is located on 
stack instead of on heap one has to make it struct instead of class. I 
am trying it just now. The question is though, how to use operator 
overloading in such cases? Normally if it was a class I would new a 
return value, but here... hmmm... Can anyone write me an example of how 
to make add operator for two STRUCT vectors?

tia,

ssuukk

--------------------------------

alias real frReal;

struct frVector
{
	frReal x; frReal y; frReal z;
	
	void set(frReal xx, frReal yy, frReal zz) {
		x=xx; y=yy; z=zz;
	 }
	
	void set(frVector vv) {
		x=vv.x; y=vv.y; z=vv.z;
	 }
	
	frVector opNeg() {
		????????
	}
}
Dec 17 2003
next sibling parent reply Patrick Down <Patrick_member pathlink.com> writes:
This is what you need.

In article <brppgb$2ei0$1 digitaldaemon.com>, ssuukk says...
Sometime ago someone suggested that to make a vector that is located on 
stack instead of on heap one has to make it struct instead of class. I 
am trying it just now. The question is though, how to use operator 
overloading in such cases? Normally if it was a class I would new a 
return value, but here... hmmm... Can anyone write me an example of how 
to make add operator for two STRUCT vectors?

tia,

ssuukk

--------------------------------

alias real frReal;

struct frVector
{
	frReal x; frReal y; frReal z;
	
	void set(frReal xx, frReal yy, frReal zz) {
		x=xx; y=yy; z=zz;
	 }
	
	void set(frVector vv) {
		x=vv.x; y=vv.y; z=vv.z;
	 }

frVector opNeg() { frVector rtn; rtn.x = -x; rtn.y = -y; rtn.z = -z; return rtn; }
}

Dec 17 2003
parent reply "Sean L. Palmer" <palmer.sean verizon.net> writes:
And if we had constructors for structs, it would be quite a bit more
elegant.

frVector opNeg() { return frVector(-x,-y,-z); }

But we don't.   :(

Sean

"Patrick Down" <Patrick_member pathlink.com> wrote in message
news:brpva6$2nd2$1 digitaldaemon.com...
 This is what you need.

 In article <brppgb$2ei0$1 digitaldaemon.com>, ssuukk says...
Sometime ago someone suggested that to make a vector that is located on
stack instead of on heap one has to make it struct instead of class. I
am trying it just now. The question is though, how to use operator
overloading in such cases? Normally if it was a class I would new a
return value, but here... hmmm... Can anyone write me an example of how
to make add operator for two STRUCT vectors?

tia,

ssuukk

--------------------------------

alias real frReal;

struct frVector
{
 frReal x; frReal y; frReal z;

 void set(frReal xx, frReal yy, frReal zz) {
 x=xx; y=yy; z=zz;
 }

 void set(frVector vv) {
 x=vv.x; y=vv.y; z=vv.z;
 }

frVector opNeg() { frVector rtn; rtn.x = -x; rtn.y = -y; rtn.z = -z; return rtn; }
}


Dec 17 2003
parent reply Patrick Down <Patrick_member pathlink.com> writes:
In article <brq7mn$1t2$1 digitaldaemon.com>, Sean L. Palmer says...
And if we had constructors for structs, it would be quite a bit more
elegant.

frVector opNeg() { return frVector(-x,-y,-z); }

But we don't.   :(

Sean

Yeah, that would be nice. I've started doing this but it's not as nice. struct Vector { static Vector make(float x, float y, float z) { Vector rtn; rtn.x = x; rtn.y = y; rtn.z = z; return rtn; } Vector opNeg() { return Vector.make(-x,-y,-z); } } struct Vector { }
"Patrick Down" <Patrick_member pathlink.com> wrote in message
news:brpva6$2nd2$1 digitaldaemon.com...
 This is what you need.

 In article <brppgb$2ei0$1 digitaldaemon.com>, ssuukk says...
Sometime ago someone suggested that to make a vector that is located on
stack instead of on heap one has to make it struct instead of class. I
am trying it just now. The question is though, how to use operator
overloading in such cases? Normally if it was a class I would new a
return value, but here... hmmm... Can anyone write me an example of how
to make add operator for two STRUCT vectors?

tia,

ssuukk

--------------------------------

alias real frReal;

struct frVector
{
 frReal x; frReal y; frReal z;

 void set(frReal xx, frReal yy, frReal zz) {
 x=xx; y=yy; z=zz;
 }

 void set(frVector vv) {
 x=vv.x; y=vv.y; z=vv.z;
 }

frVector opNeg() { frVector rtn; rtn.x = -x; rtn.y = -y; rtn.z = -z; return rtn; }
}



Dec 17 2003
next sibling parent "Charles" <sanders-consulting comcast.net> writes:
Smooth!

C

"Patrick Down" <Patrick_member pathlink.com> wrote in message
news:brqa50$5im$1 digitaldaemon.com...
 In article <brq7mn$1t2$1 digitaldaemon.com>, Sean L. Palmer says...
And if we had constructors for structs, it would be quite a bit more
elegant.

frVector opNeg() { return frVector(-x,-y,-z); }

But we don't.   :(

Sean

Yeah, that would be nice. I've started doing this but it's not as nice. struct Vector { static Vector make(float x, float y, float z) { Vector rtn; rtn.x = x; rtn.y = y; rtn.z = z; return rtn; } Vector opNeg() { return Vector.make(-x,-y,-z); } } struct Vector { }
"Patrick Down" <Patrick_member pathlink.com> wrote in message
news:brpva6$2nd2$1 digitaldaemon.com...
 This is what you need.

 In article <brppgb$2ei0$1 digitaldaemon.com>, ssuukk says...
Sometime ago someone suggested that to make a vector that is located




stack instead of on heap one has to make it struct instead of class. I
am trying it just now. The question is though, how to use operator
overloading in such cases? Normally if it was a class I would new a
return value, but here... hmmm... Can anyone write me an example of




to make add operator for two STRUCT vectors?

tia,

ssuukk

--------------------------------

alias real frReal;

struct frVector
{
 frReal x; frReal y; frReal z;

 void set(frReal xx, frReal yy, frReal zz) {
 x=xx; y=yy; z=zz;
 }

 void set(frVector vv) {
 x=vv.x; y=vv.y; z=vv.z;
 }

frVector opNeg() { frVector rtn; rtn.x = -x; rtn.y = -y; rtn.z = -z; return rtn; }
}




Dec 17 2003
prev sibling next sibling parent ssuukk <ssuukk .go2.pl> writes:
 Yeah, that would be nice.  I've started doing this
 but it's not as nice.
 
 struct Vector
 {
 static Vector make(float x, float y, float z)
 {
 Vector rtn;
 
 rtn.x = x;
 rtn.y = y;
 rtn.z = z;
 
 return rtn;
 }
 
 Vector opNeg()
 {
 return Vector.make(-x,-y,-z);
 }
 }
 

Dec 18 2003
prev sibling parent ssuukk <ssuukk .go2.pl> writes:
I made frVector struct with static make function as quasi-constructor. 
Strangely for some time in the day the compiler didn't complain, but now 
(in the second half of the day) it does:

	// niby-konstruktor
	static frVector make(frReal xx, frReal yy, frReal zz){
		frVector result;
		result.x=xx; result.y=yy; result.z=zz;
		return result;
	}

	frVector opMul(frVector vv){
		return frVector.make(vv.x*x,vv.y*y,vv.z*z);
	}

gives:

"undefined identifier module frVector.make" error. I don't get it. Why 
did it work before?
Dec 18 2003
prev sibling parent J Anderson <REMOVEanderson badmama.com.au> writes:
ssuukk wrote:

 Sometime ago someone suggested that to make a vector that is located 
 on stack instead of on heap one has to make it struct instead of 
 class. I am trying it just now. The question is though, how to use 
 operator overloading in such cases? Normally if it was a class I would 
 new a return value, but here... hmmm... Can anyone write me an example 
 of how to make add operator for two STRUCT vectors?

 tia,

 ssuukk

-Anderson
 --------------------------------

 alias real frReal;

 struct frVector
 {
     frReal x; frReal y; frReal z;
     
     void set(frReal xx, frReal yy, frReal zz) {
         x=xx; y=yy; z=zz;
      }
     
     void set(frVector vv) {
         x=vv.x; y=vv.y; z=vv.z;
      }
     
     frVector opNeg() {
         ????????
     }
 }

Dec 17 2003