假设我有这个伪代码:
bool conditionA = executeStepA();
if (conditionA){
bool conditionB = executeStepB();
if (conditionB){
bool conditionC = executeStepC();
if (conditionC){
...
}
}
}
executeThisFunctionInAnyCase();
Run Code Online (Sandbox Code Playgroud)
executeStepX当且仅当前一个成功时才应执行函数.无论如何,executeThisFunctionInAnyCase应该在最后调用该函数.我是编程的新手,对于这个非常基本的问题感到抱歉:有没有办法(例如在C/C++中)避免长if链产生那种"代码金字塔",代价是代码易读性?
我知道如果我们可以跳过executeThisFunctionInAnyCase函数调用,代码可以简化为:
bool conditionA = executeStepA();
if (!conditionA) return;
bool conditionB = executeStepB();
if (!conditionB) return;
bool conditionC = executeStepC();
if (!conditionC) return;
Run Code Online (Sandbox Code Playgroud)
但约束是executeThisFunctionInAnyCase函数调用.该break声明是否可以某种方式使用?
我在Windows下设置了XML-RPC服务器/客户端通信.我注意到的是,如果交换的数据量变得很大,那么启动服务器监听"localhost"与"127.0.0.1"会有所不同.如果设置了"127.0.0.1",则通信速度比使用"localhost"快.有人可以解释一下原因吗?我认为这可能是命名解决的问题,但......本地也是如此?
我读这个有关自定义类型的QT文档页面,并声明如下:
如果要将类型集成到元对象系统中,则默认构造函数,复制构造函数和析构函数都是必需的,并且必须是公共的.
假设我有一个需要使用一些必需参数构建的对象,因为没有必要使用默认构造函数构建,例如:
struct IntPair
{
IntPair(int first, int second);
~IntPair();
};
Run Code Online (Sandbox Code Playgroud)
为了使它在QT元对象系统中可用,正如doc所述,它需要默认的构造函数.但实际上,在没有IntPair一对整数的情况下给出构建对象的机会是没有意义的(对于丑陋的例子而言).
有没有办法实现这一点而不实现默认构造函数?我正在考虑我的对象和QT元对象系统之间的某种友谊 ......
基本上,我无法理解为什么需要默认构造函数.
最初,有master分支。
然后我从master创建了一个feature_1分支,以实现功能 1。
在这个新分支上做了一些工作之后,我决定实现功能 2,它依赖于功能 1,所以我这样做了:
$ git checkout -b feature_2 feature_1
Run Code Online (Sandbox Code Playgroud)
我在feature_2分支上做了一些工作。
现在,继续在feature_1分支上进行开发是没有意义的,因为它的所有开发都包含在feature_2分支中。
删除feature_1分支是否“安全”,即使它是我启动feature_2分支的基础?删除后,我会在 Git 图中看到从master分支开始的单个feature_2分支吗?
我想要实现的是上面写的,当我启动feature_1分支时,从master分支开始的单个feature_2分支。最后,将其重命名为feature_1_2分支。
为了在Windows XP下部署使用VS2013编译器构建的C++应用程序,必须设置"v120_xp"平台工具集:这使得从XP到8.1的部署成为可能.接下来的问题是:为什么这个平台工具集不是唯一的默认工具?"v120"平台工具集适用于从Windows Vista开始.有任何性能缺陷吗?我已经测试了一个针对Windows 8下的平台工具集构建的应用程序,但我发现性能没有差别(显然......).
为什么我不能在头文件中初始化静态const char*?在我的代码中,我在我的类头中:
static const char* xml_ID_TAG;
Run Code Online (Sandbox Code Playgroud)
在cpp中:
const char* Class::xml_ID_TAG = "id";
Run Code Online (Sandbox Code Playgroud)
xml_ID_TAG变量包含XML文档的属性字符串.因为它是静态的,const,原始类型(char*)等...我无法弄清楚为什么编译器禁止编写类似的东西:
static const char* xml_ID_TAG = "id";
Run Code Online (Sandbox Code Playgroud)
我正在使用MSVC2013编译器,给出上面的错误示例:"错误:具有类内初始化程序的成员必须是const"
您是否曾经历过C++项目编译中的慢速链接过程(我正在使用VS2013)?我在5分钟Build之后花了15分钟获得链接过程.重建或Visual Studio重新启动不能解决问题.任务管理器显示mspdbsrv.exe占用一个完整的核心(4核上25%),并且pdb文件创建非常慢,Kb后Kb达到50 Mb.附加信息:
谢谢.
我正在使用QT 5.7,并且来自doc:
bool QDir::rename(const QString &oldName, const QString &newName)
Run Code Online (Sandbox Code Playgroud)
我为什么要指定dir的oldName?这不是现在的名字吗?我正在考虑这个重载函数:
bool QDir::rename(const QString &newName){
return this->rename(this->dirName(), newName);
}
Run Code Online (Sandbox Code Playgroud)
API是否指向当前目录的子目录?
Git 有没有办法用一个命令聚合 2 个分支?
假设我有一个分支feature1正在开发一个功能,另一个分支feature2正在开发另一个功能。
现在我想融合这两个功能,因为开发feature1需要在分支上开发一些东西feature2,反之亦然。
AFAIK,我可以通过执行 2 次合并、签出feature1、合并feature2到其中,然后签出feature2并合并feature1到其中来实现此目的。
有没有办法使用单个命令使 2 个分支汇聚成 1 个合并点?接下来,他们再次在两个独立的分支中继续。
在我的C++程序中,我有一个基类B和一些派生类D1,D2等.然后我有一个函数作为参数派生类D1,由const引用传递以提高性能,而不是通过副本传递它:
void appendDerived(const D1& derived)
{
listOfDerived.append(D1);
}
Run Code Online (Sandbox Code Playgroud)
listOfDerived是派生类的列表,因此append方法如下:
void append(Base* base)
{
if (!base) return;
m_myList.append(base->clone()); //clone function is defined for each derived and does: return new D1(*this);
}
Run Code Online (Sandbox Code Playgroud)
由于appendDerived取作为参数常量引用,编译器为在append方法错误,因为有一个为不匹配的函数追加.我发现的解决方案如下:
将appendDerived函数更改为:
void appendDerived(D1 derived)
{
listOfDerived.append(&derived);
}
Run Code Online (Sandbox Code Playgroud)
所以通过值传递参数,但性能损失.
将appendDerived函数更改为:
void appendDerived(D1* derived)
{
listOfDerived.append(derived);
}
Run Code Online (Sandbox Code Playgroud)
所以通过指针传递参数,这意味着我要在整个代码中将所有函数调用更改为appendDerived,但有些缺点我不想在此处列出...
在追加之前创建一个中间变量:
void appendDerived(const D1& derived)
{
D1 derived_temp = derived;
listOfDerived.append(&derived_temp);
}
Run Code Online (Sandbox Code Playgroud)
但似乎是一个太脏的解决方案......
你有更好的主意吗?
在我的C++程序中,我有两个类(B1和B2),它们有自己的方法,但有1个("意外").例如:
B1类标题:
void height();
void size();
void enabled();
Run Code Online (Sandbox Code Playgroud)
B2级标题:
void width();
void length();
void enabled();
Run Code Online (Sandbox Code Playgroud)
现在我有一个继承自B1和B2的A类.由于enabled()多重继承后方法中存在"冲突",我该如何避免这种情况?有没有办法从继承中排除方法?例如,我可以enabled()从B1类中排除继承(我不能将其设置为私有,因为它是从B1派生的其他类中使用的).还有其他想法吗?
我有一个多线程C++应用程序,它可以从任何线程调用类似下面的函数,从列表/向量中获取一个Object.
class GlobalClass{
public:
MyObject* GlobalClass::getObject(int index) const
{
/* mutex lock & unlock */
if (m_list.hasValueAt(index))
return m_list[index];
else
return 0;
}
List<MyObject*> m_list;
};
//Thread function
MyObject* obj = globalClass->getObject(0);
if (!obj) return;
obj->doSomething();
Run Code Online (Sandbox Code Playgroud)
注意:这里的范围是通过引用,值或指针来理解与函数返回相关的一些最佳实践,因此请原谅一些伪代码或缺少声明(我使用锁定/解锁,GlobalClass是全局单例等等) .
这里的问题是,如果MyObject在那个索引中删除里面GlobalClass,在某一点上我使用了一个坏指针(obj).
所以我在考虑返回该项目的副本:
MyObject GlobalClass::getObject(int index) const
{
/* mutex lock & unlock */
if (m_list.hasValueAt(index))
return MyObject(*m_list[index]);
else
return MyObject();
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是MyObject返回的object()是一个足够大的对象,返回副本效率不高.
最后,我想返回对该对象的引用(更好的const引用):
const MyObject& GlobalClass::getObject(int index) const …Run Code Online (Sandbox Code Playgroud) 假设我有这个基本的C++类:
class Foo
{
public:
void Foo() {m_a=0; m_b=0;}
void Foo(int a, int b)
{
m_a=a;
m_b=b;
}
void setA(int a) {m_a=a;}
void setB(int b) {m_b=b;}
static void init(int a, int b, Foo* foo)
{
if(foo) *foo = Foo(a, b);
}
private:
int m_a;
int m_b;
};
Run Code Online (Sandbox Code Playgroud)
在我的主要班级我做:
int main()
{
Foo f;
Foo::init(1, 2, &f);
Foo::init(1, 2, &f);
Foo::init(1, 2, &f);
}
Run Code Online (Sandbox Code Playgroud)
这个程序有内存泄漏吗?初始化这样的类是一个好习惯,还是喜欢这样的类:
static void init(int a, int b, Foo* foo)
{
if(foo){ foo->setA(a); foo->setB(b); }
}
Run Code Online (Sandbox Code Playgroud) c++ ×8
git ×2
qt ×2
c ×1
constructor ×1
control-flow ×1
friend ×1
git-branch ×1
if-statement ×1
inheritance ×1
ip ×1
linker ×1
msbuild ×1
pdb-files ×1
python ×1
reference ×1
visual-c++ ×1
windows ×1
xml-rpc ×1