C++ 控件到达非void函数的末尾

C++ 控件到达非void函数的末尾,c++,qt,return,C++,Qt,Return,以下代码段在编译时生成一些警告消息: Cluster& Myclass::getCluster(const Point &p) { foreach (Cluster c, *this) foreach (Point point, c) if (point == p) return c; } 警告如下: 返回对局部变量“c”的引用[默认启用] 控件到达非void函数的末尾[使用-Wreturn类型时]

以下代码段在编译时生成一些警告消息:

Cluster& Myclass::getCluster(const Point &p)
{
    foreach (Cluster c, *this)
        foreach (Point point, c)
            if (point == p)
                return c;
}
警告如下:

返回对局部变量“c”的引用[默认启用] 控件到达非void函数的末尾[使用-Wreturn类型时] 我知道如果条件失败,我不会返回值。但是,当我尝试返回0时,它给了我错误

如何解决这些问题?

变量c是一个局部变量,正如在getCluster函数中声明和定义的那样。通过返回对它的引用,当函数将该引用点返回到变量原来所在的位置时

对于另一个警告,如果条件从未为真,那么函数返回什么?

变量c是一个局部变量,正如它在getCluster函数中声明和定义的那样。通过返回对它的引用,当函数将该引用点返回到变量原来所在的位置时

对于另一个警告,如果条件从未为真,那么函数返回什么

返回对局部变量“c”的引用[默认启用]

您不应该返回对局部变量的引用,因为一旦返回函数,该变量就不再存在,因此您可以引用不存在的内容。编译器会警告您这一点

控件到达非无效函数的末尾[-Wreturn类型]

为函数指定返回类型后,每个控件路径都应返回该值。如果条件的计算结果为false,那么您的代码永远不会返回任何内容,因此编译器会抱怨

返回对局部变量“c”的引用[默认启用]

您不应该返回对局部变量的引用,因为一旦返回函数,该变量就不再存在,因此您可以引用不存在的内容。编译器会警告您这一点

控件到达非无效函数的末尾[-Wreturn类型]


为函数指定返回类型后,每个控件路径都应返回该值。如果条件的计算结果为false,那么您的代码将永远不会返回任何内容,因此编译器会对此进行投诉。

如果您的函数能够合法地找到匹配的群集,那么您应该让它返回指针:

Cluster* Myclass::getCluster(const Point &p)
{
    foreach (Cluster c, *this)
        foreach (Point point, c)
            if (point == p)
                return &c;
    return 0; // or return nullptr; in C++11
}
但这还不起作用,因为c是一个局部变量。因此,您将其作为参考,如下所示:

Cluster* Myclass::getCluster(const Point &p)
{
    foreach (Cluster& c, *this)
        foreach (Point point, c)
            if (point == p)
                return &c;
    return 0; // or "return nullptr;" in C++11
}

如果您的函数可以合法地找不到匹配的集群,那么您应该让它返回一个指针:

Cluster* Myclass::getCluster(const Point &p)
{
    foreach (Cluster c, *this)
        foreach (Point point, c)
            if (point == p)
                return &c;
    return 0; // or return nullptr; in C++11
}
但这还不起作用,因为c是一个局部变量。因此,您将其作为参考,如下所示:

Cluster* Myclass::getCluster(const Point &p)
{
    foreach (Cluster& c, *this)
        foreach (Point point, c)
            if (point == p)
                return &c;
    return 0; // or "return nullptr;" in C++11
}

第一个意思是c是一个局部变量。因此,当函数返回时,它将超出范围并消亡。由于您是通过引用返回的,因此调用者将获得一个悬空引用。另一个错误是在某些条件下无法返回任何内容。返回0没有帮助,因为返回类型是对集群的引用。您需要某种机制来确保返回对不会立即死亡的集群的集群引用。参见示例。

第一个表示c是局部变量。因此,当函数返回时,它将超出范围并消亡。由于您是通过引用返回的,因此调用者将获得一个悬空引用。另一个错误是在某些条件下无法返回任何内容。返回0没有帮助,因为返回类型是对集群的引用。您需要某种机制来确保返回对不会立即死亡的集群的集群引用。请参阅示例。

当我尝试返回0时,它给了我错误,这是什么意思?您在哪里包含了返回0,错误是什么?当我尝试返回0时,它给了我错误,这是什么意思?您在哪里包含了返回0以及错误是什么?您可以补充说,他的foreach是一个谎言,因为他实际上不会为每个值执行。这样的谎言往往会让阅读代码的人感到困惑。@James:任何被这样一个简单循环弄糊涂的人都不应该首先阅读代码。@TonyK任何故意编写误导性代码的人都不应该首先编写代码。说要对序列中的每个元素执行以下操作,然后不执行,这是故意误导。@James:这是在使用标准编程结构来执行任务,仅此而已。故意误导是荒谬的。你可以补充说,他的foreach是一个谎言,因为他实际上不会执行每个值。这样的谎言往往会让阅读代码的人感到困惑。@James:任何被这样一个简单循环弄糊涂的人都不应该首先阅读代码。@TonyK任何故意编写误导性代码的人都不应该首先编写代码。说要对序列中的每个元素执行以下操作,然后不执行,这是故意误导。@James:这是在使用标准编程结构来执行任务,而
没关系。故意误导是荒谬的。@shobi:如果成功,您应该返回指向动态分配内存的指针;如果失败,您应该返回NULL;重要的是,您应该记录此api的行为,如果成功,用户应该释放分配的内存。@Als:No,你不应该在这里分配内存。群集已经存在-只需返回其地址即可。@TonyK:如果群集是在本地创建的,我看不出返回其地址将如何解决OPs问题。@Als:如果您使用引用,则不会在本地创建群集-请参阅我的答案。@shobi:如果成功,您应该返回指向动态分配内存的指针;如果失败,则返回空值,重要的是,您应该记录此api的行为,如果成功,用户应该释放分配的内存。@Als:不,您不应该在这里分配内存。群集已经存在-只需返回其地址即可。@TonyK:如果群集是在本地创建的,我看不出返回其地址将如何解决OPs问题。@Als:如果使用引用,则不会在本地创建群集-请参阅我的答案。在内部循环中通过引用进行迭代可能更可取:foreach const Point&Point,c`@TonyK你能给出一个关于将局部变量作为引用返回的理论链接吗?@Dewsworld:我不是将局部变量作为引用返回-我是返回c的地址,因为c是一个引用,是一个已经存在的集群的地址。第6行中的&in是运算符的地址,第3行中的&in声明c作为引用。这个混淆的来源是建立在C++中的。没有指出c是从*这获取地址的,这不是本地的。谢谢:在内部循环中通过引用进行迭代很可能更可取:foreach const Point&Point,c`@TonyK你能给出一个关于将局部变量作为引用返回的理论链接吗?@Dewsworld:我不是将局部变量作为引用返回-我是返回c的地址,因为c是一个引用,是一个已经存在的集群的地址。第6行中的&in是运算符的地址,第3行中的&in声明c作为引用。这个混淆的来源是建立在C++中的。没有指出c是从*这获取地址的,这不是本地的。谢谢: