小编Rod*_*ddy的帖子

好的还是坏的C++成语 - 纯粹用于构造函数/析构函数的对象?

我有几个类除了在它们的构造函数/析构函数中什么都不做.这是一个例子

class BusyCursor 
{
  private:
    Cursor oldCursor_;

  public:

    BusyCursor()
    {
      oldCursor_ = CurrentCursor();
      SetCursor(BUSY_CURSOR);
    }
    ~BusyCursor()
    {
      SetCursor(oldCursor_);
    }
}

// example of use
    void DoSlowThing
    {
      BusyCursor busy;
      ... do something time-consuming  ...
    }
Run Code Online (Sandbox Code Playgroud)

我有点担心未来的可读性.我在这里过于"狡猾",有一个从未在代码中实际使用的变量("忙")吗?一些静态分析工具是否可以建议将它们删除,或者这个成语是否足够常见而不用担心?

c++ idioms raii

9
推荐指数
3
解决办法
1130
查看次数

从C++切换到Java:关键点是什么?

我是一名经验丰富的开发人员,但我的大部分OO编程经验都是使用C++(还有一点Delphi).我正在考虑做一些Android工作,因此Java.

来自C++背景,Java的哪些领域最有可能让我感到惊讶/烦恼/喜悦?

我确信这已经被问过,但是我的搜索没有提出类似的问题.

CW,当然.

c++ java

9
推荐指数
2
解决办法
396
查看次数

哪个STL容器用于基于密钥访问的有序数据?

假设我有一个Person对象的集合,每个对象看起来像这样:

class Person 
{
  string Name;
  string UniqueID;
}
Run Code Online (Sandbox Code Playgroud)

现在,对象必须存储在一个容器中,这个容器允许我对它们进行排序,这样我就可以给项目X轻松找到项目X + 1和X-1.

但是,我还需要基于UniqueID的快速访问,因为集合将很大并且线性搜索不会削减它.

我当前的'解决方案'是将std :: list与std :: map结合使用.该列表包含Persons(用于有序访问),该映射用于将UniqueID映射到对列表项的引用.更新"容器"通常涉及更新地图和列表.

它有效,但我觉得应该有一个更聪明的方法,也许boost:bimap.建议?

编辑:关于我对"订购"的要求存在一些困惑.为了解释,对象从文件顺序流式传输,容器中项目的"顺序"应与文件顺序匹配.订单与ID无关.

c++ containers stl

9
推荐指数
2
解决办法
379
查看次数

为什么%zd printf格式在VS2010中不起作用?

下面的代码片段不会在visual studio中打印出值.

int main() { 
    intptr_t P = 10;
    printf("test value is %zd",P);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

test value is zd
Run Code Online (Sandbox Code Playgroud)

我希望上面的代码打印出来

test value is 10
Run Code Online (Sandbox Code Playgroud)

我使用intptr_t而不是整数,以使代码在32位和64位架构中进行调整.

c visual-studio-2010 visual-studio

9
推荐指数
1
解决办法
4760
查看次数

如何在Delphi中获取本地化的日期名称?

我正在使用标准Delphi常量DayMonday等,我想将它们转换为本地化字符串(例如"Lundi").是否有简单的RTL或VCL调用?

delphi dayofweek

8
推荐指数
1
解决办法
4195
查看次数

正确初始化boost :: scoped_ptr数组的方法?

我有一个类,其中包含一个指向没有默认构造函数的对象的作用域指针数组.

我发现"初始化"它们的唯一方法就是这样使用swap():

class Bar {
  Bar(char * message) {};
}

class Foo 
{
  boost::scoped_ptr<Bar> arr[2];

  Foo()
  {
    arr[0].swap(boost::scoped_ptr<Bar>( new Bar("ABC") ));
    arr[1].swap(boost::scoped_ptr<Bar>( new Bar("DEF") ));
  };
}
Run Code Online (Sandbox Code Playgroud)

这感觉有点冗长和笨重.我错过了一种更聪明的方法吗?

c++ boost smart-pointers

8
推荐指数
2
解决办法
3822
查看次数

在Delphi中使用管理员权限开发应用程序

我在Windows 7下使用D2010来编写一个似乎需要管理员权限的应用程序(我认为因为它使用COM与第三方.exe进行通信,这也需要管理员权限).

我已根据需要添加了清单资源,但是当我尝试从IDE调试应用程序时,它会报告

"无法创建流程.请求的操作需要提升"

......它不会运行.如果我以管理员身份运行Delphi,那么我的应用程序运行正常,但这感觉就像一种危险的暴力方法,特别是因为我开发的大多数应用程序都不需要管理员权限.

有没有办法让Delphi在我运行我的应用程序时提示提升,而不是让整个IDE运行升级?

delphi uac elevation windows-7 delphi-2010

8
推荐指数
3
解决办法
1万
查看次数

Delphi的CSV导入/导出向导?

为了避免重新发明轮子,我正在寻找一些对话框向导组件/库,这将简化我将CSV和类似文本文件导入我的Delphi/C++ Builder应用程序的工作.

换句话说,我们的应用程序的用户可以"打开"一个合适的文本文件,他们可以通过UI"描述"列的布局方式以及文件列与我们的应用程序提供的数据字段的关系.

基本要求:-

  • 处理不同的换行样式
  • 处理选项卡,逗号和用户指定的固定宽度列
  • 用户可定义的列排序,可视化预览结果
  • 处理可选和必填列

额外的好东西: -

  • 能够将所有设置保存为"配置文件",以便以后轻松重新应用.

csv delphi import wizard

8
推荐指数
1
解决办法
3632
查看次数

如何修复RapidXML字符串所有权问题?

RapidXML是一个快速,轻量级的C++ XML DOM Parser,但它有一些怪癖.

我想到的最糟糕的是:

3.2字符串的所有权.

RapidXml生成的节点和属性不拥有其名称和值字符串.他们只是指着他们.这意味着在使用xml_base::name(const Ch *)xml_base::value(const Ch *)函数手动设置这些值时必须小心.

必须注意确保传递的字符串的生命周期至少与节点/属性的生命周期一样长.实现它的最简单方法是从文档拥有的memory_pool中分配字符串.使用 memory_pool::allocate_string() 功能用于此目的.

现在,我明白它是以这种方式为速度做的,但这感觉就像车祸等待发生.以下代码看起来无害,但当foo返回时,'name'和'value'超出范围,因此doc未定义.

void foo()
{
  char name[]="Name";
  char value[]="Value";

  doc.append_node(doc.allocate_node(node_element, name, value));
}
Run Code Online (Sandbox Code Playgroud)

根据allocate_string()手动工作使用的建议,但它很容易忘记.

有没有人'增强'RapidXML来避免这个问题?

c++ rapidxml

7
推荐指数
1
解决办法
1211
查看次数

"临时对象"警告 - 是我还是编译器?

以下代码段给出了警告:

[C++ Warning] foo.cpp(70): W8030 Temporary used for parameter '_Val' in call to 'std::vector<Base *,std::allocator<Base *> >::push_back(Base * const &)'
Run Code Online (Sandbox Code Playgroud)

..在指定的行上.

class Base
{
};

class Derived: public Base
{
public:
 Derived()   // << warning disappears if constructor is removed!
 {
 };
};

std::vector<Base*> list1;
list1.push_back(new Base);
list1.push_back(new Derived);  // << Warning on this line!
Run Code Online (Sandbox Code Playgroud)

编译器是Codegear C++ Builder 2007.

奇怪的是,如果Derived的构造函数被删除,警告就会消失......是我还是编译器?

编辑:我发现删除警告的唯一方法是类似于此:

Derived * d;
list1.push_back(d = new Derived);  // << No warning now...
Run Code Online (Sandbox Code Playgroud)

c++ warnings c++builder

7
推荐指数
1
解决办法
871
查看次数