- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们有一个 Base
类和一个Derived
派生自 Base
的类.
在其他一些类中,我们希望有一个 shared_ptr<Base>
类型的成员.
我们不能使用类型 Base
直接因为像这样直接复制会排除子类。
但是,我们还是想“复制”Base
(或子类)对象在构建时结束,因为我们要排除它被修改的可能性。
处理这个问题的经典方法是放置一个虚拟成员函数 clone()
进入Base
Base
的每个子类的类然后可以执行。每个clone()
然后只会返回其自身的“拷贝” - 例如,Derived
会返回 make_shared<Derived>(*this)
.
这种方法的问题是这需要 Base
的每个新子类实现此 clone()
功能。每个 clone()
中的代码相当样板化,一直重复它似乎有点不自然。
自 C++11 以来,有没有更好的方法来做到这一点?
最佳答案
在纯 C++ 中始终可以做到这一点:
struct base
{
virtual ~base () {}
virtual base* clone () = 0;
virtual void foo () = 0;
};
template <typename T>
struct base_impl : base
{
T* clone () { return new T (*static_cast<T*> (this)); }
};
struct derived : base_impl<derived>
{
void foo () { ... }
};
struct derived2 : base_impl<derived2>
{
void foo () { ...}
};
等等
您可以使用 C++11 改进它:您可以使用 unique_ptr<base>
(但是你丢失了协变返回类型),你可以创建 base_impl
的析构函数私有(private)和使用friend T
.
我同意在这种情况下这不是很灵活但是:
另一种解决方案。这可能可以通过多种方式进行改进,但我认为您无法避免使用两个克隆函数:
struct base
{
std::unique_ptr<base> clone () { return std::unique_ptr<base> (do_clone ()); }
private:
virtual base *do_clone () = 0;
};
template <typename T>
struct base_impl : base
{
std::unique_ptr<T> clone ()
{
return std::unique_ptr<T> (static_cast<T*> (do_clone ()));
}
private:
base *do_clone () { return new T (*static_cast<T*> (this)); }
};
关于c++ - C++11 中有什么好的新方法可以将其他 "cloned"的 "hierarchy-classes"对象存储为成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897385/
如果有人能为我分解它,让我能理解它,我会非常感激。我知道它用于通过 apply 方法创建新对象。 Function.prototype.new = function () { var args
新版本的HADOOP中有一个方法。http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#conc
根据支持库变更日志和 Fragment 类文档 ( https://developer.android.com/reference/android/support/v4/app/Fragment.ht
根据支持库更改日志和 Fragment 类文档 (https://developer.android.com/reference/android/support/v4/app/Fragment.htm
执行Async BigJob() 的无限运行任务的正确方法是什么?并且可以根据要求停止 提示:我正在尝试学习 [一种] 新方法来更新我现有的策略。 我有一个简单的程序(测试程序),它有一个开始 和停止
我将解释我的想法:我使用 python 作为谷歌应用程序引擎 + js + css 主项目将存储在 src 文件夹下,如下所示:\src \app <--- 这里是 gae 的所有 python 应用
我是一名优秀的程序员,十分优秀!