我已经使用 Unity 一段时间了,然后回来使用 Visual Studio 2015 做一些 C++。我遇到了这个类定义
class A
{
public:
A();
virtual ~A();
A(const A&) = delete;
A& operator=(const A&) = delete;
private:
…
}
这个类是动态分配的,如下所示:
ObjPtr obj = ObjPtr(new A());
哪里ObjPtr是定义的类型,看起来像:
typedef std::unique_ptr<A> objPtr;
并将这些创建的对象添加到 std::vector<ObjPtr>使用 std::move .有一次,我需要遍历对象列表,如果我找到满足我条件的对象,请保留一份拷贝。
ObjPtr keep;
for(auto& object : GetObjectList() )
{
if(/*check if its the object I want*/)
{
keep = object;
}
}
其中 GetObjectList 返回 const std::vector<ObjPtr>& .
但我收到“试图引用已删除的函数”。我做了一些谷歌搜索并试图删除 = delete部分,甚至评论了 2 行。我什至尝试过
ObjPtr keep = std::move(object);
但我仍然收到已删除函数的错误。任何人都可以看到我做错了什么或指出一些可以提供帮助的资源吗?
最佳答案
A std::unique_ptr无法复制。即使托管对象可以(但你的不能)。
这里有几个选择(都有不同的效果):
更改 keep 的类型到一个非拥有的原始指针(又名 A * )并使用 keep = object.get(); .当且仅当您知道您不会使用 keep 时,这是安全的长于 ObjectList (或者更准确地说,您获取地址的对象)存在。
移动std::unique_ptr从容器中取出,即使用keep = std::move(object); .当然,现在你在 ObjectList 上有差距了. (我知道你已经编辑了你的问题,说 ObjectList 是 const 这意味着你不能修改,因此不能将对象移出它。)
更改 ObjPtr 的类型至 std::shared_ptr<A>如果您想要共享所有权语义。
如果您绝对想要对象的拷贝,您可以添加 virtual A 的成员函数以多态方式克隆对象。
class A
{
public:
virtual std::unique_ptr<A> clone() = 0;
…
};
然后您在每个叶子中实现该函数 class源自 A .在你的循环中,你然后使用 keep = object->clone(); .为此,您可能希望创建复制构造函数 protected但不要delete
不要使用 keep = std::make_unique<A>(*object);因为它不会尊重对象的实际(动态)类型并且总是切片到 A . (因为你的 A 是不可复制的,所以它无论如何也行不通。)
关于c++ - std::unique_ptr 试图引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849004/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin