小编ABC*_*lus的帖子

如何避免"如果"链?

假设我有这个伪代码:

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声明是否可以某种方式使用?

c c++ if-statement control-flow

262
推荐指数
25
解决办法
4万
查看次数

"localhost"与"127.0.0.1"的表现

我在Windows下设置了XML-RPC服务器/客户端通信.我注意到的是,如果交换的数据量变得很大,那么启动服务器监听"localhost"与"127.0.0.1"会有所不同.如果设置了"127.0.0.1",则通信速度比使用"localhost"快.有人可以解释一下原因吗?我认为这可能是命名解决的问题,但......本地也是如此?

python windows ip xml-rpc

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

在QT自定义对象中使默认构造函数为私有

我读这个有关自定义类型的QT文档页面,并声明如下:

如果要将类型集成到元对象系统中,则默认构造函数,复制构造函数和析构函数都是必需的,并且必须是公共的.

假设我有一个需要使用一些必需参数构建的对象,因为没有必要使用默认构造函数构建,例如:

struct IntPair
{    
    IntPair(int first, int second);
    ~IntPair();
};
Run Code Online (Sandbox Code Playgroud)

为了使它在QT元对象系统中可用,正如doc所述,它需要默认的构造函数.但实际上,在没有IntPair一对整数的情况下给出构建对象的机会是没有意义的(对于丑陋的例子而言).

有没有办法实现这一点而不实现默认构造函数?我正在考虑我的对象和QT元对象系统之间的某种友谊 ......

基本上,我无法理解为什么需要默认构造函数.

c++ qt constructor access-control friend

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

删除 Git 中的“基本”分支

最初,有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分支。

git git-branch

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

默认情况下,VS2013"v120_xp"作为平台工具集

为了在Windows XP下部署使用VS2013编译器构建的C++应用程序,必须设置"v120_xp"平台工具集:这使得从XP到8.1的部署成为可能.接下来的问题是:为什么这个平台工具集不是唯一的默认工具?"v120"平台工具集适用于从Windows Vista开始.有任何性能缺陷吗?我已经测试了一个针对Windows 8下的平台工具集构建的应用程序,但我发现性能没有差别(显然......).

visual-c++ windows-xp-sp3 visual-studio-2013

4
推荐指数
1
解决办法
8587
查看次数

C++内联初始化静态const char*

为什么我不能在头文件中初始化静态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++

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

VS2013 C++:慢速链接过程

您是否曾经历过C++项目编译中的慢速链接过程(我正在使用VS2013)?我在5分钟Build之后花了15分钟获得链接过程.重建或Visual Studio重新启动不能解决问题.任务管理器显示mspdbsrv.exe占用一个完整的核心(4核上25%),并且pdb文件创建非常慢,Kb后Kb达到50 Mb.附加信息:

  • 另一台计算机上的同一项目在可接受的时间内构建和链接.
  • 防病毒已被禁用
  • 我已经尝试更改pdb文件创建位置:没有成功
  • 我已经设置了链接器输出Verbose,但它在一个调试行停止,然后在那里等待所有时间.
  • VS2013更新为SP4
  • 我的笔记本电脑上的硬盘活动大多关闭,因此磁盘上没有完整的活动.
  • 我正在运行Windows 7 Pro.
  • VS2013以管理员权限运行

谢谢.

msbuild linker build-process pdb-files visual-studio-2013

4
推荐指数
1
解决办法
5086
查看次数

QDir :: rename:冗余参数?

我正在使用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是否指向当前目录的子目录?

c++ qt

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

如何在 Git 中聚合 2 个分支

Git 有没有办法用一个命令聚合 2 个分支?

假设我有一个分支feature1正在开发一个功能,另一个分支feature2正在开发另一个功能。

现在我想融合这两个功能,因为开发feature1需要在分支上开发一些东西feature2,反之亦然。

AFAIK,我可以通过执行 2 次合并、签出feature1、合并feature2到其中,然后签出feature2并合并feature1到其中来实现此目的。

有没有办法使用单个命令使 2 个分支汇聚成 1 个合并点?接下来,他们再次在两个独立的分支中继续。

git branching-and-merging

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

从常量对象引用到指针

在我的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方法错误,因为有一个为不匹配的函数追加.我发现的解决方案如下:

  1. 将appendDerived函数更改为:

    void appendDerived(D1 derived)
    {
       listOfDerived.append(&derived);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    所以通过值传递参数,但性能损失.

  2. 将appendDerived函数更改为:

    void appendDerived(D1* derived)
    {
       listOfDerived.append(derived);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    所以通过指针传递参数,这意味着我要在整个代码中将所有函数调用更改为appendDerived,但有些缺点我不想在此处列出...

  3. 在追加之前创建一个中间变量:

    void appendDerived(const D1& derived)
    {
       D1 derived_temp = derived;
       listOfDerived.append(&derived_temp);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但似乎是一个太脏的解决方案......

你有更好的主意吗?

c++

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

如何避免继承冲突

在我的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++ inheritance multiple-inheritance

0
推荐指数
1
解决办法
123
查看次数

引用类型返回函数:如何返回(可选)对象

我有一个多线程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++ reference

0
推荐指数
1
解决办法
207
查看次数

初始化类和内存泄漏

假设我有这个基本的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++

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