指向父级的持久指针

时间:2011-03-20 13:48:45

标签: c++ oop pointers model

如何将this用作持久指针,以便在当前范围之外工作?

至于这个例子,我不知道应该如何设置fx.parent

class Effect
{
    Card* parent;
};

class Card
{
    vector<Effect> effects;
    void addEffect(Effect);
};

Card::addEffect(Effect fx)
{
    /*
     * the `this` pointer is not persistent and
     * will not work outside of this scope
     */
    fx.parent = this; 
    this->effects.push_back(fx);
}

PS:我很感激任何有关指针何时被破坏,无效等的文献。我真的找不到任何可读的东西。实际上没什么。

4 个答案:

答案 0 :(得分:2)

对象的this指针与获取地址相同:

#inclide <iostream>

class X{
public:
    X* GetThis(){
        return this;
    }
};

int main(){
    X x;
    X* addr_x = &x;
    X* this_x = x.GetThis();
    if(addr_x == this_x)
        std::cout << "Both are the same" << std::endl;
    else
        std::cout << "Shouldn't happen" << std::endl;
}

See at Ideone. 因此,this只是指向具有特殊名称的类的普通指针,因此您的代码在使用this方面没有问题。除此之外,还有一些错误,例如Card::addEffectCard* parent的定义中缺少的返回类型和class Effect中的Card是私有的,因此{{1}无法访问它}。

答案 1 :(得分:2)

将元素推入容器会复制它们。所以你应该链接副本,而不是原始的:

Card::addEffect(Effect fx)
{
    effects.push_back(fx);
    effects.back().parent = this;
}

否则,当addEffect返回时,您将链接到超出范围的局部变量。

请注意,由于传值,此代码会生成另一个副本。让我们摆脱它:

Card::addEffect(Effect const& fx)
{
    effects.push_back(fx);
    effects.back().parent = this;
}

另请注意,一旦容量耗尽,向量将执行内部重新分配,并且所有指针都将变为无效。最简单的解决方法是从头开始预留足够的空间:

Card::Card()
{
    effects.reserve(1000);   // never more than 1000 effects at once
}

如果您无法接受,则必须使用其他容器(std::list<Effect>)或将效果放在堆上并手动管理它们(std::vector<Effect*>)或使用智能指针({{ 1}})。

答案 2 :(得分:0)

好的,所以它是这样的:

首先,关键字“ this ”表示当前对象 所以在这种背景下:

Card::addEffect(Effect fx)
{
    fx.parent = this; 
    this->effects.push_back(fx);
}

对象,其中调用了 addEffect()函数。

其次,指针不会失效或被破坏。您可以使用删除运算符来销毁它们指向的对象:

Blah* pointer = new Blah();
delete pointer;

答案 3 :(得分:0)

跟踪卡片对象的方式也会导致问题。当您的卡对象复制时,父指针将始终指向原始的Card对象。您需要编写一个复制构造函数来解决此问题或防止复制发生。