我在我的C++程序中使用了很多初始化列表但是没有意识到你可以在其中分配内存.
所以你可以这样做(作为一个人为的例子):
class Test
{
private:
int* i;
int* j;
int count;
int* k;
public:
Test(void) : i(new int), j(new int[10]), count(10), k(new int[count])
{
}
~Test(void)
{
delete i;
delete [] j;
delete [] k;
}
};
Run Code Online (Sandbox Code Playgroud)
以这种方式进行内存分配是否有任何问题?关于初始化的顺序,在同一列表中初始化的参数初始化参数是否安全?即我count在使用它之前分配它是否安全使用或是否有一些特殊的初始化顺序我可能会犯规?
锁定类的类型与类本身的锁定有什么区别?
例如:
private readonly object xmpp = new object();
lock (xmpp)
{
...
}
Run Code Online (Sandbox Code Playgroud)
VS
lock (typeof(Xmpp))
{
...
}
Run Code Online (Sandbox Code Playgroud) 我在完全掌握Qt中如何使用信号和插槽方面遇到了一些困难.我相信这是非常基本的,但我今天没有得到它.
我有一组小部件有点像这样:
MainWindow - > StackedWidget - > ChildForms
现在的想法是,子窗口小部件上有一些操作会导致堆叠窗口小部件显示不同的页面.
因此,如果我理解正确,我认为连接信号和插槽的方法是使用connect()知道对象的范围,但我设法工作的方法不是这样做的.在我的子表单中,我使用parentWidget()来访问StackedWidget的插槽但我真的不是很满意,因为它给了孩子关于它不应该具有的父节点的信息:
void TaskSelectionForm::setButtonMappings()
{
// Set up a mapping between the buttons and the pages
QSignalMapper *mapper = new QSignalMapper(this);
connect(mapper, SIGNAL(mapped(int)), parentWidget(), SLOT(setCurrentIndex(int)));
mapper->setMapping(ui->utilitiesButton, 2); // Value of the index
connect(ui->utilitiesButton, SIGNAL(clicked()), mapper, SLOT(map()));
}
Run Code Online (Sandbox Code Playgroud)
但我不确定我应该怎么做并将其连接起来.我是否需要在每个级别都有信号并通过树发射?
我不确定构造函数是否正是我正在寻找的但如果我解释我想要做什么,希望有人可以告诉我,如果我想做的是一个愚蠢的想法或是否有办法做到这一点.
所以我有一个枚举:
public enum MessageType
{
Normal,
Error,
Chat,
Groupchat,
Headline
}
Run Code Online (Sandbox Code Playgroud)
这个枚举基本上是jabber.net的包装器MessageType.所以我想从中创建我的枚举.所以目前我有这样的功能:
private MessageType ConvertMessageType(JabberMessageType jabberType)
{
MessageType type = MessageType.Error;
switch (jabberType)
{
case JabberMessageType.normal:
type = MessageType.Normal;
break;
//etc
}
return type;
}
Run Code Online (Sandbox Code Playgroud)
所以我必须使用 enum MessageType type = ConvertMessageType(JabberMessageType.groupchat);
我想要的是能够做到这样的事情:
enum MessageType type = MessageType(JabberMessageType.groupchat);
// or
enum MessageType type = MessageType.FromJabberJid(JabberMessageType.groupchat);
Run Code Online (Sandbox Code Playgroud)
因此,转换属于枚举而不是外部的方法.
我正在查看一些代码进行审核,并且遇到了繁忙的等待:
int loop = us*32;
int x;
for(x = 0;x<loop;x++)
{
/*do nothing*/
}
Run Code Online (Sandbox Code Playgroud)
我似乎记得读过这些空循环可以被优化掉.这是在这里发生的事情还是可以的?
我不在电脑上,所以目前无法对此进行测试,但需要查看一些代码.我仍然有点处于C++思维框架中.
因此,当在C源文件中声明typedef时,它的作用域是什么?我知道要使函数和变量只在同一个翻译单元中可用,你需要将它们设置为静态,我想知道typedef是否相同?
目前我们将使用2个数据库.一个来自预先存在的产品,因此我们无法控制它.另一个是我们完全控制的.
目前我们使用EF4 CTP,因为我们需要空间功能,但显然这不能用于产品代码,而EF的最新版本不具有空间性,因为这是针对.Net Framework的后续版本,因此决定如下前进的方向,一个建议是转移到NHibernate并使用空间插件.
所以第一个问题是关于学习曲线和工具之间的移动.在我的眼里,似乎NHibernate在它正在做的事情上更加明显,EF隐藏了它在典型MS风格中所做的很多事情,这是否公平?
所以我认为前进的方法是使用类图来描述我们控制的数据库.然后我们将创建POCO lasses,然后您需要创建映射文件.它真的像那样直截了当吗?这些映射文件,我们需要手动编写它们还是我们有一个工具来创建POCO类?
下一个问题是关于预先存在的数据库以及我们在这里做了什么.EF可以很容易地导入数据库并创建类,并且它在NHibernate中是直接的吗?
如果它影响答案
我们控制的数据库使用MS SQL数据库.我们不是Oracle,我们使用Oracle的ODAC实体框架代码.
非常感谢你
我一直在读这里的其他问题,有些东西让我感到困惑,希望可以解释.我确信这是一件简单的事情,但它暗指着我.
所以在C++中我们有私有变量只能在类中查看:
class MyClass
{
private:
int i;
};
Run Code Online (Sandbox Code Playgroud)
但我们也可以拥有未命名的命名空间:
namespace
{
int i;
}
Run Code Online (Sandbox Code Playgroud)
两者似乎都是该类的私有,但在第二种情况下,您无法从头文件中看到它们存在.从阅读其他问题看,函数是不同的,因为你不能将类对象传递给它们?但我不确定变量的区别在哪里.
第二种方式是否存在缺点,这意味着您仍然应该使用私有变量?
我正在查看一些我正在重构的代码并注意到try ... catch代码包含了相当多的代码,而不是所有抛出"正常"异常的代码,即代码根本不会抛出或者如果它执行了将是完全致命的例外,如内存异常.
我现在想知道的是,在try语句中包含太多是否会导致性能问题?
所以我看到这样的事情:
try
{
// Won't throw (I think that is the case anyway!)
if (e.Error == null)
{
return;
}
// Only fatal exceptions
myClass c = new myClass();
// Now carry out the code that could cause catchable exception
}
catch
{
}
Run Code Online (Sandbox Code Playgroud) 我正在查看已创建的代码,它在一个方法调用中使用TryEnter并锁定其他方法.所以,像这样:
private readonly object xmppLock = new object();
void f1()
{
if (Monitor.TryEnter(xmppLock))
{
try
{
// Do stuff
}
finally
{
Monitor.Exit(xmppLock);
}
}
}
void f2()
{
lock(xmppLock)
{
// Do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这个可以吗?