开发者

C++: Passing reference of constructing object to constructed member objects?

Okay, consider the following classes:

开发者_开发百科
class Object
{
public:
    // Constructor
    Object() : 
        [Initialization List]
    {
        ...
    }
    ...
};

class Container
{
public:
    Object A;
    Object B;

    ....

    Container() :
        [Initialization List]
    {
    }
};

I'd like to provide [access to Container and it's members] to the Objects.

My first thought was to somehow pass a reference to the current Container object to the constructors of the Objects. But I can't figure out how to do this.

I've messed around with "this", but I'm not getting anything that works. I tried something like this:

class Object
{
public:
    Container& c

    // Constructor
    Object(Container& c_) : 
        c(c_)
    {
        ...
    }
    ...
};

class Container
{
public:
    Object A;
    Object B;

    ....

    Container() :
        A(Object(this))
        B(Object(this))
    {
    }
};

My eventual goal is to be able to access Object B from inside a member method of Object A.

Does anyone have any insight on how to get closer to what I'm looking for?

Thanks!


It is not UB or bad, necessarily, to use this in an initializer list, although care is needed, and your code is perfectly valid with minor modification.

class Container;
class Object
{
public:
    Container& c

    // Constructor
    Object(Container& c_) : 
        c(c_)
    {
    }
};

class Container
{
public:
    Object A;
    Object B;

    Container() :
        A(Object(*this))
        B(Object(*this))
    {
    }
};

this is a pointer, you wanted a reference, and a simple de-reference will do the trick. This is perfectly legal and defined code. What's not allowed is to access any member data or functions through the pointer, because those member data or functions simply may not exist yet until the init list is finished. But it definitely is allowed to take a pointer or reference to an object during it's initializer list and pass it around.


How about just using pointers? Edit: fixed code to avoid this in initializer list.

class Container;

class Object
{
public:
    Container *c;

    // Constructor
    Object(Container *c_) : 
        c(c_)
    {
    }
};

class Container
{
public:
    Object *A, *B;

    Container()
    {
        A = new Object(this);
        B = new Object(this);
    }
};


You shouldn't pass this in initializers for members of the class whose instance you're constructing, but you can pass it later, so there's two easy ways around your problem

  • use a setter on the object (A.setContainer(*this)) in the constructor's body
  • make A and B pointers, initialize them to NULL and do a A = new Object(this) in the constructor's body
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜