2015-10-19 2 views
-1
class testClass 
{ 
public: 
    void set(int monthValue, int dayValue); 
    int getMonth(); 
    int getDay(); 
private: 
    int month; 
    int day; 
}; 

J'ai une classe simple comme on peut le voir ci-dessus. J'essaie de transmettre ses objets à une fonction qui vérifie s'ils sont égaux ou non.passage des membres de la classe à vide *

testClass obj[3]; 
obj[0].set(1,1); 
obj[1].set(2,1); 
obj[2].set(1,1); 

Tout d'abord, j'ai essayé comme cout << (obj[0] == obj[1]);, mais il est impossible sans surcharger l'opérateur, en utilisant le modèle etc Donc, je peux le faire les utiliser, mais comment puis-je passer les variables membres à la fonction void*? Je pensais comme ça, mais je ne peux pas résoudre le problème. Je veux comparer comme

obj[0].getDay() == obj[1].getDay(); 
obj[0].getMonth() == obj[1].getMonth(); 

en passant.

+1

Quel est le problème exactement? Je ne comprends pas de votre question. –

+1

Il n'y a absolument aucun besoin de 'void *' ici. Votre 'compare_class' pourrait prendre' const DayOfYear & ', mais vous devrez utiliser des getters publics ou faire de la fonction un' friend'. – crashmstr

+2

Si vous ne voulez pas comparer par 'foo-foo2', alors faites quelque chose d'autre. Je suis extrêmement méfiant de la présomption que tout ce que vous essayez de faire devrait être fait d'une manière qui nécessite des pointeurs de vide. – Hurkyl

Répondre

0

Dans la fonction compare_class, que vous avez écrit, vous comparez les adresses des objets réels. Ce qui ne veut rien dire en termes d'égalité d'objet. Que devrait renvoyer la fonction? Si les objets sont égaux? Il est écrit d'une manière qui stipule: si les emplacements des objets diffèrent - retour vrai; si les emplacements sont les mêmes, renvoyez false, ce qui est contraire à ce que vous voulez.

Étant donné que vous n'utilisez aucun pointeur dans votre classe et que vous ne souhaitez pas utiliser la surcharge de l'opérateur, consultez memcmp. L'utilisation serait la suivante:

if (0 == memcmp (&obj[0], &obj[1], sizeof (obj[0])) 
    { 
    // Do stuff. 
    } 
+3

Vous suggérez sérieusement 'memcmp' à un débutant qui est déjà sur la mauvaise voie avec tout le non-sens du pointeur? Sensationnel. S'abstenir de downvoting seulement parce que vous êtes le premier ici à mentionner la différence entre l'identité et l'égalité. –

+0

@ChristianHackl Il a explicitement déclaré qu'il voulait comparer 2 objets sans l'utilisation de la surcharge de l'opérateur. Chaque suggestion, d'après ce que j'ai vu, était d'une façon ou d'une autre - liée à la surcharge de l'opérateur. Cette solution n'a pas utilisé la surcharge de l'opérateur, donc j'ai pensé que c'était une réponse directe à la question OPs. –

6

Que diriez-vous d'ajouter cette méthode (publique) à votre classe?

// overloading the "==" comparison operator (no templates required in this particular case 
bool operator==(const DayOfYear& otherDay) const 
{ 
    return (month == otherDay.month) && (day == otherDay.day); 
} 

Ensuite, vous pouvez comparer comme ceci:

DayOfYear day1; 
DayOfYear day2; 
// ... 
if (day1 == day2) // syntactically equivalent to to: if (day1.operator==(day2)) 
{ 
    // ... 
} 

EDIT: puisque vous ne voulez pas utiliser la surcharge de l'opérateur, vous pouvez toujours le faire avec une fonction/méthode statique comme celui-ci :

bool compareDates(const DayOfYear& day1, const DayOfYear& day2) 
{ 
    return (day1.getMonth() == day2.getMonth()) && (day1.getDay() == day2.getDay()); 
} 

Ensuite, comparez comme ceci:

DayOfYear day1; 
DayOfYear day2; 
// ... 
if (compareDates(day1, day2)) 
{ 
    // ... 
} 
+0

@itsnotmyrealname Ensuite, lancez juste si vous êtes sûr qu'il réussit. –

+0

@itsnotmyrealname: consultez l'édition – 865719

+2

@itsnotmyrealname: Pourquoi ne l'utilisez-vous pas? C'est la bonne solution. –

0

Vous pouvez ajouter la fonction d'ami dans votre classe:

#include <iostream> 
using namespace std; 
class DayOfYear 
{ 
public: 
void set(int monthValue, int dayValue) { 
    month = monthValue; 
    day = dayValue; 
} 

friend bool compare(DayOfYear&d1,DayOfYear&d2) { 

    return (d1.getDay() == d2.getDay()) && (d1.getMonth() == d2.getMonth()); 
} 

int getMonth() { return month; } 

int getDay() { return day; } 

private: 
int month; 
int day; 
}; 

int main(){ 

DayOfYear obj[3]; 
obj[0].set(1,1); 
obj[1].set(1,1); 
obj[2].set(1,1); 


if(compare(obj[0],obj[1])){ 
    cout<<"Match"<<endl; 
} 


return 0; 
}