几年前我把我的C++技能放在架子上,现在看来,当我再次需要它们时,景观已经改变了.
我们现在有了C++ 11,我的理解是它与许多Boost功能重叠.
是否存在这些重叠的摘要,哪些Boost库将成为遗产,推荐哪些C++ 11功能使用而不是增强哪些,哪些更好?
我有一节课:
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Run Code Online (Sandbox Code Playgroud)
我该如何修改它以禁用如下代码:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
Run Code Online (Sandbox Code Playgroud)
并且只允许以下代码:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
Run Code Online (Sandbox Code Playgroud) 使用C++ 11中显式删除的成员函数,是否仍然值得从不可复制的基类继承?
我在谈论私有继承基类的技巧,该基类具有私有或删除的复制构造函数和复制赋值(例如boost::noncopyable
).
这个问题提出的优势是否仍适用于C++ 11?
我不明白为什么有些人声称在C++ 11中使类不可复制更容易.
在C++ 03中:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
Run Code Online (Sandbox Code Playgroud)
在C++ 11中:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
Run Code Online (Sandbox Code Playgroud)
编辑:
正如许多人所指出的那样,为私有拷贝构造函数和拷贝赋值运算符提供空体(即{})是错误的,因为这将允许类本身调用那些运算符而没有任何错误.我首先开始没有添加{},但遇到了一些链接器问题,这些问题让我添加{}有些愚蠢的原因(我不记得这些情况).我知道更清楚.:-)
控制反转是一种价值证明技术,用于模块化系统并使组件彼此分离.
低耦合始终是一个优势:它简化了组件的自动测试,使代码更符合单一责任原则.
在申报依赖于另一个类(方式服务定位,物业注入调用的公共方法/设置一个公共属性...),构造注入似乎是最好的办法.
虽然它可能是最难实现的(至少来自列出的三个),但它具有显着的优势:
C++提供的许多选择通过构造函数执行注入的优缺点是什么?
c++ dependency-injection inversion-of-control constructor-injection
C++ 11通过允许您使用"= delete"语法将隐式编译器定义的方法标记为verboten来解决长期困扰我的问题. 维基百科了解更多信息.
class Foo
{
public:
Foo();
~Foo();
// No copy
Foo(Foo const &) = delete;
Foo& operator=(Foo const &) = delete;
};
Run Code Online (Sandbox Code Playgroud)
我不希望复制或分配的类的复制和赋值运算符总是很难搞乱.这是一个很大的锅炉板代码,使它们成为私有的,然后通常会有成员数据,没有一个默认的构造函数,需要一些挥手让编译器对你想要没有人调用的函数感到高兴.
class Bar
{
public:
explicit Bar(UniqueResourceID id): m_data(id) { }
~Bar();
protected:
SomeHandle m_data; // no default constructor
// all this crap to keep from being able to copy. Do not use any of these!!
private:
Bar() { } // ERROR: m_data has no default constructor
static UniqueResourceID s_invalidID; // now I'm making the …
Run Code Online (Sandbox Code Playgroud) 有没有办法创建一个通用宏来删除复制构造函数,赋值运算符
//Below two lines are class specific, and looking to replace with some generic way
//without mentioning hardcoded class name
#define NO_COPY Original(_In_ const Original&) = delete;
#define NO_ASSIGNMENT Original& operator=(_In_ const Original&) = delete;
//simple class
class Original
{
public:
NO_COPY;
NO_ASSIGNMENT;
};
Run Code Online (Sandbox Code Playgroud)