我有几个类除了在它们的构造函数/析构函数中什么都不做.这是一个例子
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)
我有点担心未来的可读性.我在这里过于"狡猾",有一个从未在代码中实际使用的变量("忙")吗?一些静态分析工具是否可以建议将它们删除,或者这个成语是否足够常见而不用担心?
我是一名经验丰富的开发人员,但我的大部分OO编程经验都是使用C++(还有一点Delphi).我正在考虑做一些Android工作,因此Java.
来自C++背景,Java的哪些领域最有可能让我感到惊讶/烦恼/喜悦?
我确信这已经被问过,但是我的搜索没有提出类似的问题.
CW,当然.
假设我有一个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无关.
下面的代码片段不会在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位架构中进行调整.
我正在使用标准Delphi常量DayMonday等,我想将它们转换为本地化字符串(例如"Lundi").是否有简单的RTL或VCL调用?
我有一个类,其中包含一个指向没有默认构造函数的对象的作用域指针数组.
我发现"初始化"它们的唯一方法就是这样使用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)
这感觉有点冗长和笨重.我错过了一种更聪明的方法吗?
我在Windows 7下使用D2010来编写一个似乎需要管理员权限的应用程序(我认为因为它使用COM与第三方.exe进行通信,这也需要管理员权限).
我已根据需要添加了清单资源,但是当我尝试从IDE调试应用程序时,它会报告
"无法创建流程.请求的操作需要提升"
......它不会运行.如果我以管理员身份运行Delphi,那么我的应用程序运行正常,但这感觉就像一种危险的暴力方法,特别是因为我开发的大多数应用程序都不需要管理员权限.
有没有办法让Delphi在我运行我的应用程序时提示提升,而不是让整个IDE运行升级?
为了避免重新发明轮子,我正在寻找一些对话框向导组件/库,这将简化我将CSV和类似文本文件导入我的Delphi/C++ Builder应用程序的工作.
换句话说,我们的应用程序的用户可以"打开"一个合适的文本文件,他们可以通过UI"描述"列的布局方式以及文件列与我们的应用程序提供的数据字段的关系.
基本要求:-
额外的好东西: -
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++ 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)