首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++ 11的“移动工厂”

c++ 11的“移动工厂”
EN

Stack Overflow用户
提问于 2013-06-17 22:46:43
回答 1查看 932关注 0票数 1

我想做一个工厂风格的生成器,它接受A并输出A的子类RA (它将信息添加到A)。但我真的想不出一个安全的方法来做这件事。

结构:

代码语言:javascript
运行
复制
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;

最安全的方法可能是

代码语言:javascript
运行
复制
  AR GenerateRA1(A&& a)
  {
    return AR(std::forward<A>(a),std::string("foo"));
  }

这将强制a被销毁。问题是,这会导致用户在函数调用之前无法以任何方式使用a的参数,这可能会很烦人:

代码语言:javascript
运行
复制
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“的调用在没有内置检查以查看对象是否已被销毁的情况下发生了可怕的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 01:37:44

代码语言:javascript
运行
复制
AR ar = fact.GenerateRA1(std::move(a));//does...reference to a is still around, but destroyed

用户请求将内容从a移动到函数中,她知道可能已经移动了a的内容,并且知道类型A她知道可以对对象a做什么或不可以做什么。This is a problem,这就是事情的运作方式。

代码语言:javascript
运行
复制
//AR ar = fact.GenerateRA1(a); //doesn't compile

这正是重点所在。编译器拒绝此代码,因此用户不需要检查a是否被移出(*),只有当用户显式地请求移动时(因此知道而不必猜测),编译器才会移出对象。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17150412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档