我想做一个工厂风格的生成器,它接受A并输出A的子类RA (它将信息添加到A)。但我真的想不出一个安全的方法来做这件事。
结构:
class A
{
public:
std::string str;
A(std::string a)
{
str = a;
}
A(A&& a) :
str(std::move(a.str))
{
}
};
class AR : public A
{
public:
std::string str1;
AR(std::string a,std::string b) : A(a)
{
str1 = b;
}
AR(A &&a,const std::string& b)
: A(std::forward<A>(a))
{
str1 = b;
}
AR(AR&& ar)
: A(std::forward<A>(ar)),
str1(std::move(ar.str1))
{
}
};
class ARFactory;
最安全的方法可能是
AR GenerateRA1(A&& a)
{
return AR(std::forward<A>(a),std::string("foo"));
}
这将强制a被销毁。问题是,这会导致用户在函数调用之前无法以任何方式使用a的参数,这可能会很烦人:
ARFactory fact;
{
AR ar=fact.GenerateRA1(A("bar"));//compiles
}
{
A a("bar");
a.str += "1";
//AR ar = fact.GenerateRA1(a);//doesn't compile
AR ar = fact.GenerateRA1(std::move(a));//does...reference to a is still around, but destroyed
std::cout << "a.str=" << a.str << " b.str=" << ar.str << " ar.str1=" << ar.str1 << std::endl;
}
这样可以吗?我可以看到对"a“的调用在没有内置检查以查看对象是否已被销毁的情况下发生了可怕的错误。
发布于 2013-06-18 01:37:44
AR ar = fact.GenerateRA1(std::move(a));//does...reference to a is still around, but destroyed
用户请求将内容从a
移动到函数中,她知道可能已经移动了a
的内容,并且知道类型A
她知道可以对对象a
做什么或不可以做什么。This is a problem,这就是事情的运作方式。
//AR ar = fact.GenerateRA1(a); //doesn't compile
这正是重点所在。编译器拒绝此代码,因此用户不需要检查a
是否被移出(*),只有当用户显式地请求移动时(因此知道而不必猜测),编译器才会移出对象。
https://stackoverflow.com/questions/17150412
复制相似问题