如何比较 2 个对象的私有成员?
How to compare 2 objects' private member?
我有两个类:
class A
{
int aa;
};
class B
{
int bb;
};
class C
{
public:
bool equal(A& av,B& bv)
{
return (av.aa==bv.bb);
}
};
当然,由于私有成员的访问,类C存在编译错误。有没有办法实现C类的equal()
成员?
一个好的解决方案可能是在A和B类中提供getter。这样你就可以把所有东西都封装起来。例如
class A
{
int aa;
public:
int GetAA()
{
return aa ;
}
};
这是使用friend
函数的一个很好的场景:
// forwarding references to each of the classes
class A;
class B;
class C
{
public:
bool equal(A& av,B& bv);
// notice we cannot implement equal() here,
// because A and B have not been defined yet,
// even though they have been declared.
};
class A
{
private:
int aa;
// Simply register to be a friend of A with our 'C::equal' function,
// so that we can access 'aa'
friend bool C::equal(A&, B&);
};
class B
{
private:
int bb;
// Once again, we register as a friend of C::equal,
// this time to access 'bb'
friend bool C::equal(A&, B&);
};
// finally, now that A and B have been fully defined,
// we can implement our equal method:
bool C::equal(A&av, B&bv)
{
return (av.aa == bv.bb);
}
// Sample Usage
int main()
{
A a = A();
B b = B();
C c = C();
c.equal(a, b);
}
我看到这样的问题并问为什么。a类和B类之间显然没有任何关系,除了它们有内在的
编译的方法是使C成为a和B的朋友,或者至少使C中的equal函数成为a和B的朋友(小心使用正向声明)。
class A;
class B;
class C { static bool equal(A const &, B const &); };
class A { friend bool C::equal(A const &, B const &) };
class B { friend bool C::equal(A const &, B const &) };
bool C::equal(A& const &a, B const &b) { return a.a == b.b; }
请注意const限定符,因为比较运算符不太可能更改其输入。不管怎样,我把它变成了一个静态函数,因为它不使用C的任何成员——它是完全无关的。(根据您的摘录)。
基本上,你就是这么做的。但不要不假思索地去做。仅仅因为苹果和橙子都有果核,并不意味着比较果核的数量有多大意义。
您可以使类friend
相互关联。
但是,正如评论中所指出的,在大多数情况下,这是非常可怕的。成员是private
的原因必须是外部不应该直接访问它。
因此,要么将operator==()
重载添加到可以使用的A
和B
中(即bool A::equal(const B&) const;
方法),要么添加访问器以返回用于外部比较的值。
与两个类(c&a,c&b)建立友谊,然后进行比较。
如果它们是私有的,并且不能通过任何类型的公共接口访问,这意味着在概念上它们没有任何共同点。所以添加公共CCD_ 9 CCD_。我不喜欢友谊。很多。
您可以使A
和B
成为C
的朋友,或者将int GetVar() const
方法添加到A
和B
类中。
为什么需要这个?
将行为与数据结合起来。
class C
{
public:
void doSomething()
{
if(aa == bb) {
doThis();
} else
doThat();
}
}
private:
int aa;
int bb;
};
在不评论请求的相关性或假定潜在原因的替代方案的情况下,我相信您可以通过Reflection:比较私人成员
FieldInfo AInfo = av.GetType().GetField("aa", BindingFlags.NonPublic | BindingFlags.Instance);
int AValue = (int) AInfo.GetValue(av);
等等
- 指向设备对象成员的指针
- 访问由unique_ptr传递的对象成员
- 引用对象成员函数的成员函数
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- Lua C API - 从C++分配和使用类的对象成员
- Rapidjson 遍历并获取复杂 JSON 对象成员的值
- 类对象成员变量在调用函数时不会更改
- 对象成员变量还是继承
- C++多态性:有没有办法找到对象成员函数的地址?
- 重载对象成员的比较运算符
- 获取未初始化对象成员的地址是否定义良好?
- 在优先级队列被推送到队列后,如何编辑对象成员
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 通过 std::bind 从对象成员检索值
- 保留对象成员变量的本地副本
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 没有默认构造函数的对象成员的 wig setter
- 对象成员数组C++默认初始化
- 如何在数组中添加对象成员
- 使用聚合创建和关联两个不同的对象成员