如何将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:我很感激任何有关指针何时被破坏,无效等的文献。我真的找不到任何可读的东西。实际上没什么。
答案 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::addEffect
中Card* 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对象。您需要编写一个复制构造函数来解决此问题或防止复制发生。