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
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
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);
 }
 }
 
They say: "Best solutions are simple solutions". Brilliant! :-)
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
You should check out the maths.d class in dig. -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