C++ C++;避免复制
考虑以下简化的立面模式:C++ C++;避免复制,c++,copy,facade,C++,Copy,Facade,考虑以下简化的立面模式: class Foo { public: int times; int eval(const int val) { return val*times; } }; class Bar { Foo foo; public: Bar(const Foo& f) : foo(f) {} double eval(const double val) { return val * foo.times; } }
class Foo {
public:
int times;
int eval(const int val) { return val*times; }
};
class Bar {
Foo foo;
public:
Bar(const Foo& f) : foo(f) {}
double eval(const double val) { return val * foo.times; }
};
显然,Bar实例仅用于评估Foo的eval()方法的特殊(即双值)解释。酒吧除了转发给foo外,没有其他成员
出于安全原因,我没有在条形图内部使用常量
引用或指针
(我只是不知道某个条形图实例是否会在某个时候从堆栈
框架中退出,所以资源管理很重要)
我的问题有两个:
C++
编译器是否可能检测到Bar仅仅是一个门面和
“内联”成员访问权限 struct Bar {
// Only accept rvalues of Foo
explicit Bar(Foo&& f) : f(std::move(f)) {}
Foo f;
};
1-是的,编译器将很可能内联函数[它取决于编译器) 2-始终坚持。在C++3中,
Foo
对象Foo
应为成员变量(如您所做),或托管指针(在复制构造函数和赋值运算符处复制,在析构函数处删除)。在C++11中,您可以使用正确的值引用
注意:这个例子不是一个facade!1。它可能会内联它。你是对的,它也是一个适配器,但我一直认为facade是该模式的更“一般”的描述(即对意图的抽象)——不是这样吗?