Re: Comparing Instances of Classes

2017-03-10 Thread DRex via Digitalmars-d-learn

On Friday, 10 March 2017 at 20:27:09 UTC, Meta wrote:

On Friday, 10 March 2017 at 17:08:42 UTC, Whatsthisnow wrote:
I guess i am just too used to the java way of x.equals(object) 
which at the source  is exactly 'return this == object'


Java would return false here too, though, if it actually did 
`this == object` in its default compare method. If I remember 
correctly, comparing two objects with == in Java compares their 
addresses, not their contents.


I must be losing my mind then


Re: Comparing Instances of Classes

2017-03-10 Thread Meta via Digitalmars-d-learn

On Friday, 10 March 2017 at 17:08:42 UTC, Whatsthisnow wrote:
I guess i am just too used to the java way of x.equals(object) 
which at the source  is exactly 'return this == object'


Java would return false here too, though, if it actually did 
`this == object` in its default compare method. If I remember 
correctly, comparing two objects with == in Java compares their 
addresses, not their contents.


Re: Comparing Instances of Classes

2017-03-10 Thread Ali Çehreli via Digitalmars-d-learn

On 03/10/2017 08:22 AM, DRex wrote:


Error: function app.A.opEquals does not override any function, did you
mean to override 'object.Object.opEquals'?

My A class appears exactly as mentioned in your comment...


FWIW, here's some other info:

  http://ddili.org/ders/d.en/object.html#ix_object.opEquals

Ali



Re: Comparing Instances of Classes

2017-03-10 Thread Whatsthisnow via Digitalmars-d-learn

On Friday, 10 March 2017 at 16:47:47 UTC, Adam D. Ruppe wrote:

On Friday, 10 March 2017 at 16:36:17 UTC, DRex wrote:
I'm fairly new to D, but this seems to be quite a pain in the 
rear for a simple comparison of instances of classes...really 
odd that comparing instances of classes in D requires that 
messing around when D seems all about simplifying things...


There often is no sensible default comparison for class 
contents (now structs on the other hand do have a default 
comparison that usually works, but structs don't have to worry 
about polymorphism), so you just need to specify what fields 
actually matter to your code...


I guess i am just too used to the java way of x.equals(object) 
which at the source  is exactly 'return this == object'


Re: Comparing Instances of Classes

2017-03-10 Thread Adam D. Ruppe via Digitalmars-d-learn

On Friday, 10 March 2017 at 16:36:17 UTC, DRex wrote:
I'm fairly new to D, but this seems to be quite a pain in the 
rear for a simple comparison of instances of classes...really 
odd that comparing instances of classes in D requires that 
messing around when D seems all about simplifying things...


There often is no sensible default comparison for class contents 
(now structs on the other hand do have a default comparison that 
usually works, but structs don't have to worry about 
polymorphism), so you just need to specify what fields actually 
matter to your code...


Re: Comparing Instances of Classes

2017-03-10 Thread DRex via Digitalmars-d-learn

On Friday, 10 March 2017 at 16:30:00 UTC, Adam D. Ruppe wrote:

On Friday, 10 March 2017 at 16:22:18 UTC, DRex wrote:
Error: function app.A.opEquals does not override any function, 
did you mean to override 'object.Object.opEquals'?


Oh sorry, maybe I messed up the const. Try:

override bool opEquals(A rhs) { ... }


and if the compiler still complains change the A to Object and 
cast it inside (but I'm pretty sure that will work, I think it 
is just const it is picky about)


Thanks.

I'm fairly new to D, but this seems to be quite a pain in the 
rear for a simple comparison of instances of classes...really odd 
that comparing instances of classes in D requires that messing 
around when D seems all about simplifying things...


Re: Comparing Instances of Classes

2017-03-10 Thread Adam D. Ruppe via Digitalmars-d-learn

On Friday, 10 March 2017 at 16:22:18 UTC, DRex wrote:
Error: function app.A.opEquals does not override any function, 
did you mean to override 'object.Object.opEquals'?


Oh sorry, maybe I messed up the const. Try:

override bool opEquals(A rhs) { ... }


and if the compiler still complains change the A to Object and 
cast it inside (but I'm pretty sure that will work, I think it is 
just const it is picky about)


Re: Comparing Instances of Classes

2017-03-10 Thread DRex via Digitalmars-d-learn

On Friday, 10 March 2017 at 16:13:21 UTC, Adam D. Ruppe wrote:

On Friday, 10 March 2017 at 16:08:05 UTC, DRex wrote:

Am I missing something here?


Yeah, you need to implement a custom equality operator.

class A {
   int member;
   override bool opEquals(const A rhs) {
return this.member == rhs.member; // and other members 
that need to be equal

   }
}


The default opEquals sees if they are the same *instance* (same 
as `a is b`), and does not look at contents. You need to define 
that yourself.


I tried the above class A, and now the compiler fails with the 
following error:


Error: function app.A.opEquals does not override any function, 
did you mean to override 'object.Object.opEquals'?


My A class appears exactly as mentioned in your comment...


Re: Comparing Instances of Classes

2017-03-10 Thread Adam D. Ruppe via Digitalmars-d-learn

On Friday, 10 March 2017 at 16:08:05 UTC, DRex wrote:

Am I missing something here?


Yeah, you need to implement a custom equality operator.

class A {
   int member;
   override bool opEquals(const A rhs) {
return this.member == rhs.member; // and other members 
that need to be equal

   }
}


The default opEquals sees if they are the same *instance* (same 
as `a is b`), and does not look at contents. You need to define 
that yourself.


Comparing Instances of Classes

2017-03-10 Thread DRex via Digitalmars-d-learn

Hi,

I am trying to compare two instances of a class.  I created a 
test program to try this, but every method I use to compare the 
instances always returns false.


this is my code to test comparison

class A
{
this()
{

}
}

void main()
{
A a = new A();
A a2 = new A();

writeln(equals(a, a2));
}

bool equals(Object obj1, Object obj2)
{
return (obj1 is obj2);
}

I have tried 'a is a2', I have tried 'a1 == a2' and many other 
ways (including opEquals from object.d) among other things and 
every single time the comparison returns false.  The comparison 
always fails and never returns true.


I am trying to do something like Object.equals(Object o) in java, 
but so far, no success.


Am I missing something here?