【问题标题】:How do I properly declare a function returning own-defined type, both in the header and the .cpp file?如何在标头和 .cpp 文件中正确声明返回自定义类型的函数?
【发布时间】:2020-02-29 19:41:05
【问题描述】:

我不熟悉 C++ 中的标头和整个抽象化,我注意到:当你在 .cpp 文件中声明一个函数时,你首先指定函数的返回类型,然后是 namespace_name :: function_signature ,函数的名称和参数与您在 .h 文件中指定的相同。然而,我应该如何编写一个函数的签名,其前向声明(如果这是.h文件中的签名被调用的方式)存在于与自己定义的返回类型相同的命名空间中? (抱歉冗长,代码比我的问题更简单;请参阅下面的说明)

我想在给定数组中找到最长的等数序列。这些是我的文件:

//"sequences.h" file
#ifndef LAB1_SEQUENCES_H
#define LAB1_SEQUENCES_H

namespace Sequences{

/**
 * Abstract Data Type for a sequence
 */
struct seq{
    int i;
    int j;
};

/**
 * Finds longest sequence of equal integers
 * arr - array to search in
 * n - number of elements in the array
 */
seq longest_equal(int* arr, int n);

}
#endif //LAB1_SEQUENCES_H

.

//"sequences.cpp" file
#include "sequences.h"


//Sequences :: seq Sequences :: longest_equal(int *arr, int n)
//seq Sequences :: longest_equal(int *arr, int n)
//struct seq longest_equal(int *arr, int n)
//Sequences :: struct seq longest_equal(int *arr, int n)
{
int i = 0, j = i + 1;
int lmax = -1, iR = -1, jR =-1 ; // lmax ar trebui sa fie 1 sau -1 ?
while (j < n )
{
    if (arr[i] == arr[j]) j ++;
    else
    {
        if (j - i > lmax) { lmax = j - i; iR = i; jR = j; }
        i = j;
        j = i + 1;
    }
}
if (lmax > 1) return Sequences :: seq(iR, jR);
return Sequences::seq(-1, -1);
}

现在,我不知道如何让 .cpp 文件中的 longest_equal 函数返回 seq 类型(我同时关注头文件中的签名和 .cpp 文件中的签名)正如我应该在函数实现结束时的返回命令之前虚拟写的,在 .cpp 文件中)。

我已尝试将第二个文件中第一个荣誉之前的注释代码行作为函数的签名。我还阅读了问题here 的答案和问题here 的一些答案,并自己尝试了一些方法,但无济于事。

【问题讨论】:

  • 你还需要注意.cpp文件中的命名空间
  • @SebastianHoffmann 你这是什么意思?我已经尝试了所有注释选项,但每个选项都会出错
  • 您可以简单地将实现包含在namespace Sequences{ ... } 中的.cpp 文件中,就像在标题中一样;然后在里面写seq longest_equal(int* arr, int n) { ... }。如果出于某种原因您坚持拼写全名,那么Sequences::seq Sequences::longest_equal(int *arr, int n) { ... } 是正确的形式。
  • @IgorTandetnik 谢谢你的评论,但我会在标题的命名空间中有一个未解析的引用...seq 将无法识别
  • 为什么不呢?我不确定我是否理解。显示您正在编译的确切代码,以及您收到的该代码的确切错误消息。

标签: c++ struct namespaces header-files return-type


【解决方案1】:

前向声明用于减少标头依赖性。由于您的 struct seq 不需要任何标头并且它所拥有的只是数据成员,因此转发声明它几乎没有意义。您应该在标题中定义它以及函数声明(并在.cpp中拥有函数定义)。

您只能将前向声明用于通过引用或指针获取和返回结构和类。在您的特定情况下,struct seq 在概念上是一个简单的聚合值,一个具有命名字段的元组。它不是您所说的抽象数据类型,因为它没有任何抽象,它相当具体并且没有行为。 abstract data type 是根据行为(函数和成员函数)定义的,而不是根据其组成的数据成员。

【讨论】:

  • “您只能将前向声明用于通过引用获取和返回结构和类” - 不完全是。对于函数返回类型,前向声明也足够了。
猜你喜欢
  • 2013-07-05
  • 2021-08-18
  • 1970-01-01
  • 2018-10-12
  • 2015-09-15
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多