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

我有一个简单的类,可以在上面看到。我试图将它的对象传递给一个检查它们是否相等的函数。传递类成员void *

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

首先,我试着像cout << (obj[0] == obj[1]);,但也不是没有可能运算符重载,使用模板等,所以,我可以用他们做,但我怎么能传递成员变量的void*功能?

bool cmp_testClass(void const *e1, void const *e2) 
{ 
    testClass* foo = (testClass *) e1; 
    testClass* foo2 = (testClass *) e2; 
    return foo - foo2; // if zero return false, otherwise true 
} 

我以为这样想,但我无法解决问题。我想比较像

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

通过。

+1

究竟是什么问题?我不明白你的问题。 –

+1

这里绝对不需要'void *'。你的'compare_class'可以使用'const DayOfYear&',但是你可能需要使用public getters或者使这个函数成为'friend'。 – crashmstr

+2

如果您不想通过'foo-foo2'进行比较,那么请执行其他操作。我非常怀疑,无论你想要做什么都应该以需要无效指针的方式完成。 – Hurkyl

回答

0

在compare_class功能,那你写,你是比较实际的对象的地址。这在对象平等方面并不意味着什么。函数应该返回什么?如果对象相同?它的写法是:如果对象的位置不同 - 返回true;如果位置相同 - 返回false,与您想要的极性相反。

既然您没有在您的班级内使用任何指针,也不想使用操作符重载,请查看memcmp。用法如下:

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

你正在认真地向一个初学者推荐'memcmp',它已经在所有指针废话的错误轨道上?哇。仅仅因为你是第一个提到身份与平等之间的区别的人,就不会屈服于投票。 –

+0

@ChristianHackl他明确表示他希望比较2个对象而不使用运算符重载。从我所看到的每一个建议都是以某种方式或另一种方式 - 与运营商超载有关。这个解决方案没有使用操作符重载,所以我认为这是OPs问题的直接答案。 –

6

如何将此(公共)方法添加到您的班级?

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

然后,你可以比较像这样:

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

编辑:既然你不想使用操作符重载,你可以随时使用这样的功能/静态方法做:

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

于是,比较如下:

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

@itsnotmyrealname然后,如果你确定它成功了,就施放。 –

+0

@itsnotmyrealname:检查编辑 – 865719

+2

@itsnotmyrealname:为什么你不能使用它?这是正确的解决方案。 –

0

您可以在类中添加好友功能:

#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; 
}