如何在头文件和.cpp文件中正确声明返回自己定义类型的函数? 我是新手,在C++中使用头文件和整个抽象化的东西,我注意到:当在.CPP文件中声明一个函数时,首先指定函数的返回类型,然后是代码>命名空间:函数的名称和参数与您在.h文件中指定的相同。但是,如果一个函数的前向声明(如果.h文件中的签名是如何调用的)与自己定义的返回类型位于同一名称空间中,我应该如何编写该函数的签名?(很抱歉这么冗长,代码比我的问题简单;请参见下面的说明)

如何在头文件和.cpp文件中正确声明返回自己定义类型的函数? 我是新手,在C++中使用头文件和整个抽象化的东西,我注意到:当在.CPP文件中声明一个函数时,首先指定函数的返回类型,然后是代码>命名空间:函数的名称和参数与您在.h文件中指定的相同。但是,如果一个函数的前向声明(如果.h文件中的签名是如何调用的)与自己定义的返回类型位于同一名称空间中,我应该如何编写该函数的签名?(很抱歉这么冗长,代码比我的问题简单;请参见下面的说明),c++,struct,namespaces,header-files,return-type,C++,Struct,Namespaces,Header Files,Return Type,我想找到给定数组中最长的等数序列。这些是我的文件: //"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

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

//"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”文件
#包括“sequences.h”
//序列::序列::最长的_相等(int*arr,int n)
//序列::最长_相等(int*arr,int n)
//结构序列最长值(整数*arr,整数n)
//序列::结构序列最长_相等(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(jlmax){lmax=j-i;iR=i;jR=j;}
i=j;
j=i+1;
}
}
if(lmax>1)返回序列::seq(iR,jR);
返回序列::seq(-1,-1);
}
现在,我不知道如何在.cpp文件return
seq
类型中使我的
longest_等于
函数(我考虑的是头文件中的签名和.cpp文件中的签名,以及在函数实现结束时的return命令之前在.cpp文件中实际上应该写些什么)


在第二个文件中的第一个荣誉之前,我尝试了注释代码行作为函数的签名。我还阅读了问题的答案和一些问题的答案,并亲自尝试了一些东西,但没有结果。

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


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

您需要将.cpp文件中的命名空间视为well@SebastianHoffmann你这是什么意思?我已经尝试了所有已注释的选项,但每个选项都给出了一个错误。您可以简单地将实现封装在
名称空间序列{…}
中的.cpp文件中,就像在头中一样;然后只需在内部写入
seq longest_equal(int*arr,int n){…}
。如果出于某种原因,您坚持拼写全名,那么
Sequences::seq Sequences::longest_equal(int*arr,int n){…}
是正确的格式。@IgorTandetnik谢谢您的评论,但是如果这样,我会在标题中的命名空间中有一个未解析的引用…
seq
将无法识别为什么不能识别?我不太明白。显示您正在编译的确切代码,以及您收到的该代码的确切错误消息。“您只能使用转发声明通过引用获取和返回结构和类”-不完全如此。对于函数返回类型,转发声明也足够了。
//"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);
}