小编sdg*_*sdg的帖子

可以安全地将NULL/0传递给dynamic_cast吗?

出于检查空指针的习惯,我有时写道:

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或有效,即不是疯狂指向垃圾......

c++ null dynamic-cast

62
推荐指数
3
解决办法
2万
查看次数

C++类接口类的析构函数

开始在现有代码库上使用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 的用户破坏,他们只是一个服务的消费者,通过这个接口到一些外部实现类(如果这会有所作为)

c++

24
推荐指数
4
解决办法
9703
查看次数

使用boost :: accumulators,如何重置滚动窗口大小,是否保留了额外的历史记录?

我正在看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,那么累加器是否具有额外的内部状态,或者我是否必须等待额外的值?

c++ boost

10
推荐指数
1
解决办法
8049
查看次数

为什么我可以从const方法调用非const成员函数指针?

一位同事询问了一些最初有模板的代码.

我已经删除了模板,但核心问题仍然是:为什么编译好了?

#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成员函数.

成员函数指针是世界常量中的文档漏洞吗?

我们错过了什么(可能对他人来说很明显)?

c++

6
推荐指数
2
解决办法
2885
查看次数

std :: string insert方法有多么模糊的重载?

环境:使用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没有此问题,因为它有一个迭代器类,而不是裸指针)

c++ stl stlport

5
推荐指数
1
解决办法
1385
查看次数

冲刺结束:如何让所有团队成员在Scrum sprint的最后几天保持忙碌?

鉴于特定冲刺中的任务不会完全划分为团队,并且所有任务都在同一天完成,那么当sprint进入最后阶段时,您如何保持每个人的工作?

似乎不可避免地会有一两个人被释放.如果所有其他任务都完成了,剩下的任务已经完成,那么什么呢?

那些团队成员是否从产品积压的顶部获取物品,因为在下一个冲刺中可能需要它们才能获得先机?

你或你的团队做什么?

agile scrum

1
推荐指数
2
解决办法
777
查看次数

标签 统计

c++ ×5

agile ×1

boost ×1

dynamic-cast ×1

null ×1

scrum ×1

stl ×1

stlport ×1