出于检查空指针的习惯,我有时写道:
MyClass * c = someBasePtr ? dynamic_cast<MyClass*>(someBasePtr) : 0;
if (c) {...
Run Code Online (Sandbox Code Playgroud)
实际上,在传递给动态强制转换之前检查空指针,并检查返回.
然后我读了MSDN文档
通过dynamic_cast将空指针值转换为目标类型的空指针值.
然后我可以安全地删除?:构造.这个C++是可移植的吗?
这样新代码就可以了
MyClass * c = dynamic_cast<MyClass*>(someBasePtr);
if (c) {...
Run Code Online (Sandbox Code Playgroud)
当然假设someBasePtr是null或有效,即不是疯狂指向垃圾......
开始在现有代码库上使用PC-Lint(恐惧和恐惧).
它抱怨的一件事是:
class IBatch
{
public:
virtual void StartBatch() =0;
virtual int CommitBatch() =0;
};
Run Code Online (Sandbox Code Playgroud)
当另一个类派生出来时,它就像一个接口一样使用它
base class 'IBatch' has no destructor
Run Code Online (Sandbox Code Playgroud)
所以,问题是:当您创建如上所述的接口类时,您是否始终包含虚拟析构函数?为什么?(是样式还是编码错误?)
编辑:应该说我不希望或希望IBatch 的用户破坏,他们只是一个服务的消费者,通过这个接口到一些外部实现类(如果这会有所作为)
我正在看boost :: accumulator框架,特别是一些rolling_window计算.
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/rolling_mean.hpp>
accumulator_set<int, stats<tag::rolling_mean> > acc(tag::rolling_window::window_size = 3);
Run Code Online (Sandbox Code Playgroud)
如您所见,我已将window_size设置为3,这样它只保留最后三个样本的平均值.
我可以在运行时修改该大小,可能是基于用户设置吗?
如果是这样,并且我增加window_size,如果累加器已经看到超过我的新window_size,那么累加器是否具有额外的内部状态,或者我是否必须等待额外的值?
一位同事询问了一些最初有模板的代码.
我已经删除了模板,但核心问题仍然是:为什么编译好了?
#include <iostream>
class X
{
public:
void foo() { std::cout << "Here\n"; }
};
typedef void (X::*XFUNC)() ;
class CX
{
public:
explicit CX(X& t, XFUNC xF) : object(t), F(xF) {}
void execute() const { (object.*F)(); }
private:
X& object;
XFUNC F;
};
int main(int argc, char* argv[])
{
X x;
const CX cx(x,&X::foo);
cx.execute();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
鉴于CX是一个const对象,其成员函数execute是const,因此在CX :: execute中执行this指针是const.
但我可以通过成员函数指针调用非const成员函数.
成员函数指针是世界常量中的文档漏洞吗?
我们错过了什么(可能对他人来说很明显)?
环境:使用STLPort 5.1.4的VS2005 C++.
编译以下代码段:
std::string copied = "asdf";
char ch = 's';
copied.insert(0,1,ch);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Error 1 error C2668: 'stlpx_std::basic_string<_CharT,_Traits,_Alloc>::insert' : ambiguous call to overloaded function
Run Code Online (Sandbox Code Playgroud)
似乎问题是对字符串对象的insert方法调用.
两个定义的重载是
void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );
Run Code Online (Sandbox Code Playgroud)
但是鉴于STLPort使用一个简单的char*作为迭代器,我的代码中insert方法中的文字零是不明确的.
因此,虽然我可以通过暗示如此轻松地克服这个问题
copied.insert(size_t(0),1,ch);
Run Code Online (Sandbox Code Playgroud)
我的问题是:规范中是否存在这种过载和可能模糊的问题?或者更有可能是特定STLPort实现的意外副作用?
(请注意,Microsoft提供的STL没有此问题,因为它有一个迭代器类,而不是裸指针)
鉴于特定冲刺中的任务不会完全划分为团队,并且所有任务都在同一天完成,那么当sprint进入最后阶段时,您如何保持每个人的工作?
似乎不可避免地会有一两个人被释放.如果所有其他任务都完成了,剩下的任务已经完成,那么什么呢?
那些团队成员是否从产品积压的顶部获取物品,因为在下一个冲刺中可能需要它们才能获得先机?
你或你的团队做什么?