我想问你关于C++中构造函数的最佳实践.我不太确定我应该在构造函数中做什么,什么不能.
我应该只将它用于属性初始化,调用父构造函数等吗?或者我甚至可以将更复杂的函数放入其中,例如读取和解析配置数据,设置外部库aso
或者我应该为此编写特殊功能?RESP.init()/ cleanup()?
什么是PRO和CON?
我想出了,例如,我可以在使用init()和时删除共享指针cleanup().我可以在堆栈上创建对象作为类属性,并在以后构建它时对其进行初始化.
如果我在构造函数中处理它,我需要在运行时实例化它.然后我需要一个指针.
我真的不知道该如何决定.
也许你可以帮帮我吗?
GCC能够通过虚拟方式建立符号链接__attribute__((weak)).我想在静态库中使用弱符号,用户可以在其应用程序中覆盖它.一个GCC风格的弱符号会让我这样做,但我不知道它是否可以用visual studio完成.
Visual Studio是否提供类似功能?
我希望在定义类时注册一个类实例.理想情况下,下面的代码可以解决问题.
registry = {}
def register( cls ):
registry[cls.__name__] = cls() #problem here
return cls
@register
class MyClass( Base ):
def __init__(self):
super( MyClass, self ).__init__()
Run Code Online (Sandbox Code Playgroud)
不幸的是,此代码会生成错误NameError: global name 'MyClass' is not defined.
#problem here我正在尝试实例化的一行是什么,MyClass但装饰者还没有返回,所以它不存在.
是不是在使用元类或类似的东西?
这是首选boost::lock_guard还是boost::mutex::scoped_lock?
我正在使用Boost.Thread,希望在可用时转向C++ 11线程.
是scoped_lock下一个c ++标准的一部分吗?
是否优先选择其他优势?
注:我知道,scoped_lock仅仅是一个typedef的lock_guard.
编辑:我错了scoped_lock是不是一typedef的lock_guard.这是一个typedef的unique_lock.
我有一个庞大的正则表达式集合,当匹配时调用一个特定的http处理程序.一些较旧的正则表达式是无法访问的(例如a.c* ? abc*),我想修剪它们.
是否有一个库给出两个正则表达式会告诉我第二个是否是第一个的子集?
我一开始并不确定这是否具有可判定性(它的气味就像一个不同名称的停止问题).但事实证明它是可判定的.
切换枚举时,您的程序是什么?每个枚举都包含在案例中?理想情况下,您希望代码能够成为未来的证明,您是如何做到的?
另外,如果一些白痴向枚举类型转换了一个任意的int呢?是否应该考虑这种可能性?或者我们是否应该假设在代码审查中会发现这样一个令人震惊的错误?
enum Enum
{
Enum_One,
Enum_Two
};
Special make_special( Enum e )
{
switch( e )
{
case Enum_One:
return Special( /*stuff one*/ );
case Enum_Two:
return Special( /*stuff two*/ );
}
}
void do_enum( Enum e )
{
switch( e )
{
case Enum_One:
do_one();
break;
case Enum_Two:
do_two();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
assert(false);我特别感兴趣的是你为什么选择这样做.
Vector的新方法data()提供了const和非const版本.
但是string的data()方法只提供const版本.
我认为他们改变了措辞,std::string以便现在要求chars连续(比如std::vector).
当时std::string::data只是错过了什么?或者是一个很好的理由只允许const访问字符串的底层字符?
注意:std::vector::data有另一个很好的功能,调用data()空向量不是未定义的行为.尽管&vec.front()是不确定的行为,如果它是空的.
这是一个复杂的问题,请在回答之前仔细考虑.
考虑这种情况.两个线程(读取器和写入器)访问单个全局int.这样安全吗?通常,我会毫不犹豫地回答,是的!
然而,在我看来,Herb Sutter并不这么认为.在他关于有效并发的文章中,他讨论了一个有缺陷的无锁队列和纠正的版本.
在第一篇文章的末尾和第二篇文章的开头,他讨论了很少考虑的变量特征,即写入顺序.Int是原子的,很好,但是int不一定是有序的,它可以破坏任何无锁算法,包括我上面的场景.我完全同意,保证现有和未来所有平台上正确的多线程行为的唯一方法是使用原子(AKA内存屏障)或互斥.
我的问题; 在实际硬件上写的重写是否有问题?还是多线程的偏执狂只是迂腐?
那么经典的单处理器系统呢?
那些更简单的RISC处理器如嵌入式电源?
澄清:我对Sutter先生所说的硬件(处理器/缓存)重新排序变量写入更感兴趣.我可以阻止优化器使用编译器开关破坏代码或手动检查汇编后编译.但是,我想知道硬件是否仍然可以在实践中搞乱代码.
有什么区别:
boost::asio::tcp::socket::async_read_some()boost::asio::tcp::socket::async_receive()据我所知,他们的文件是相同的.
我应该选择哪个?
c++ ×6
c ×2
c++11 ×2
oop ×2
boost ×1
boost-asio ×1
constructor ×1
decorator ×1
dvcs ×1
enums ×1
future-proof ×1
gcc ×1
hardware ×1
kiln ×1
mercurial ×1
metaclass ×1
python ×1
regex ×1
shared-ptr ×1
standards ×1
weak-linking ×1