我有一个项目,我想更多地使用智能指针。总的来说,我已经成功地实现了这个目标。但是,我遇到了一件事,我不确定“最佳做法”是什么。
基本上我想从函数返回一个“指针”,但要求用户将它保存在一个智能指针中。不仅如此,我不想强制使用特定的智能指针(共享与作用域)。
问题主要在于似乎没有将 scoped_ptr 升级为 shared_ptr 的正确方法(我认为这将是理想的解决方案)。我理解他们为什么不这样做,因为这将允许所有权转移,这可能会导致一些问题,例如 std::auto_ptr。
但是,转让所有权对于这个案例来说似乎是个好主意。所以我的想法是这样的:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
这“没问题”,因为 scoped_ptr 和 shared_ptr 都有从 std::auto_ptr 获取所有权的构造函数。
所以我的问题是,这是好的做法吗?有更好的解决方案吗?我能想到的唯一真正的替代方法是使用模板模板作为返回值,如下所示:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
这实际上可以很好地工作,除了我认为它也需要一些工作才能让它与 scoped_ptr 一起工作。
想法?
最佳答案
使用std::auto_ptr 是 好的做法,事实上such example被建议
作者:Bjarne Stroustrup。
auto_ptr 的移动语义为您提供了处理它的正确工具。
例如:
auto_ptr<Foo> make_foo()
{
return auto_ptr<Foo>(new Foo);
}
Foo *raw_pointer=make_foo().release();
shared_ptr<Foo> shared_pointer=make_foo();
auto_ptr<Foo> auto_pointer=make_foo();
如果您返回 shared_ptr,您将无法回退到普通指针,而使用 auto_ptr 则可以。你总是可以升级 auto_ptr 到共享但不是其他方向。
另一个重点,shared_ptr 使用原子引用计数,速度要慢得多
auto_ptr 所做的简单而高效的工作。
P.S.: scoped_ptr 只是穷人的 auto_ptr 版本 --- 它是不可复制的并且确实
没有默认构造函数。它更像是 auto_ptr 的“较少混淆”版本,与 shared_ptr 相比,它不在 tr1 中。通常使用没有太多优势
scoped_ptr 优于 auto_ptr
关于c++ - 返回需要由智能指针持有的 'pointer',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631633/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只