Как правильно объявить функцию, возвращающую собственный тип, как в заголовке, так и в файле. cpp? - PullRequest
0 голосов
/ 29 февраля 2020

Я новичок в работе с заголовками и всей абстракцией в 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);
}

Теперь я не знаю, как заставить мою функцию longest_equal в. cpp возврате файла seq type (я имею в виду как сигнатуру в заголовочном файле, так и сигнатуру в файле. cpp, а также то, что я должен фактически написать перед командами возврата в конце реализации функции, в файле. cpp ).

Я пробовал закомментированные строки кода непосредственно перед первым знаком во втором файле как сигнатуры функции. Я также прочитал ответы на вопрос здесь и некоторые ответы на вопрос здесь и попробовал что-то сам, но безрезультатно.

1 Ответ

0 голосов
/ 29 февраля 2020

Форвардные объявления используются для уменьшения зависимостей заголовка. Поскольку для вашего struct seq не требуются никакие заголовки и все, что у него есть, это элементы данных, бессмысленно объявлять об этом. Вы должны определить это в заголовке вместе с функцией объявление (и иметь функцию определение в .cpp).

Вы может использовать прямое объявление только для получения и возврата структур и классов по ссылке или по указателю. В вашем конкретном случае struct seq - это простое статистическое значение, кортеж с именованными полями, концептуально. Это не абстрактный тип данных , как вы утверждаете, потому что в этом нет ничего абстрактного, он довольно конкретен и не имеет поведения. абстрактный тип данных определяется в терминах поведения (функций и функций-членов), а не элементов данных, из которых он состоит.

...