我有一个结构(可以是类),并在另一个类中定义,如图所示
struct A{
somedata_A;
somespecificimplementation_A(someclass *S1);
};
class someclass{
somedata_someclass;
A a;
};
main(){
someclass c1, *c2;
c2 = &c1;
c1.a.somespecificimplementation_A(c2);
}
如何验证c2确实是c1的参考?请原谅我提出这个例子,因为很明显c2是c1的参考。
更新:A不存储指向someclass
的指针答案 0 :(得分:6)
如果您对父母一无所知,请比较成员'地址
void A::somespecificimplementation_A(someclass *S1)
{
if (this == &(S1->a)) {
// parent == S1
} else {
// parent != S1
}
}
答案 1 :(得分:3)
就像那样:
struct A{
int somedata_A;
int somespecificimplementation_A(someclass *S1){
if ((void*) &(S1->a) == this)
{
std::cout << "S1 is a pointer to myself" << std::endl;
return 1;
}
return 0;
}
};
答案 2 :(得分:1)
假设struct A
有一个指向c1
的指针,那么你可以指向c2
并比较指针值?与赋值运算符重载的操作类似?
答案 3 :(得分:1)
为什么要绕过并将类的指针传递给嵌套的struct,然后你必须测试它,当你可以在构造过程中由父类提供父类的引用时?
class someclass
{
public:
struct a
{
void foo()
{
parent.doSomething();
}
private:
friend someclass;
a(someclass & parent)
: parent(parent)
{}
someclass & parent;
} a;
someclass() : a(*this) {}
private:
void doSomething()
{
}
};
答案 4 :(得分:1)
虽然技术上未指定,但以下内容仍有效 最现代化的通用机器:
void A::somespecificimplementation_A( someclass* S1 )
{
char const* s = reinterpret_cast<char const*>( S1 );
char const* t = reinterpret_cast<char const*>( this );
if ( this >= s && this < s + sizeof( someclass ) ) {
// This A is a member of S1
} else {
// This A isn't
}
}
话虽如此,我会强调:
此 未由标准指定。它会继续工作 具有扁平线性寻址的机器,但可能会失败(给出 假阳性)在例如机器上分段记忆。
如果A
需要知道是谁,我会严肃质疑设计
是。的成员。
如果A
确实需要此信息,那么它确实应该存储
一个指向someclass
的指针,它被传递给它的构造函数,因此依赖关系是显而易见的。