【发布时间】: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