复杂的测试,以检查哪个对象实例化一个函数调用

时间:2013-07-18 07:34:01

标签: c++

我有一个结构(可以是类),并在另一个类中定义,如图所示

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

的指针

5 个答案:

答案 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
    }
}

话虽如此,我会强调:

  1. 未由标准指定。它会继续工作 具有扁平线性寻址的机器,但可能会失败(给出 假阳性)在例如机器上分段记忆。

  2. 如果A需要知道是谁,我会严肃质疑设计 是。的成员。

  3. 如果A确实需要此信息,那么它确实应该存储 一个指向someclass的指针,它被传递给它的构造函数,因此依赖关系是显而易见的。