Я посмотрел forward declaring, чтобы обойти ошибку компиляции «ошибка: переменная или поле« mov_avg »объявлено void».
Следующий сценарий: существует один файл data_proc.cpp с основным(), включающим настраиваемый заголовок my_mov_avg.h
, который встраивает функцию mov_avg(shared)
. Кроме того, функция заголовка обращается к class cl_shared
внутри основного файла. Файлы выглядят как:
Вперед декларация класса в заголовке вызывает неполный тип
#include <string.h> //c++ headers
#include <iostream> //red?
#include "my_mov_avg.h" //outsourced function
using namespace std;
/* class accessed from header*/
class cl_shared {
public:
//constructor
cl_shared() { };
int getint() {
return a;
}
private:
int a;
};
cl_shared shared; //class object
/*main calling function inside header*/
int main(int argc, char **argv){
mov_avg(shared);
getchar();
return 0;
}
Заголовок my_mov_avg.h
файла:
//in .h
void say();
void mov_avg();
//in .cpp
#include <string.h>
#include <iostream>
#include "my_mov_avg.h"
void say() {
std::cout << "Ohai from another .cpp file!";
}
class cl_shared; //Forward declaration
void mov_avg(cl_shared shared){
std::cout<<" int from class: "<< shared.getint()<< std::endl;
}
Теперь я жду объявил так, что тип аргумента функции определяется Я получил эту ошибку компиляции:
error: ‘shared’ has incomplete type
void mov_avg(cl_shared shared){
^
/my_mov_avg.cpp:9:11: error: forward declaration of ‘class cl_shared’
class cl_shared;
^
Как получить его для компиляции и плохой дизайн для доступа к классу cl_shared из заголовка?
Я пытаюсь добиться многократного доступа к данным (здесь разбито на изменение int), откуда была вызвана функция заголовка.
Я мог бы разбить class cl_shared
в отдельный файл заголовка и включить его в оба, но я не уверен, кроме того, он вызывает другой файл заголовка (который может и не понадобиться).
EDIT добавлен аргумент внутри my_mov_avg.h
void mov_avg(cl_shared shared);
, но до сих пор вызывает:
my_mov_avg.h:3:14: error: variable or field ‘mov_avg’ declared void
void mov_avg(cl_shared shared);
Sidenote: быстрый и грязный хак, чтобы сломать один большой CPP-файл, чтобы поместить функцию в отдельный CPP и место #include "seperate.cpp"
, где первоначально была функция. Используйте только простые программы.
Во-первых, ваше прямое объявление mov_avg() не содержит параметров, как это делает ваше определение. Затем вы не можете перенаправлять классы объявлений и использовать их напрямую, компилятор нуждается в определении в вашем .cpp, поэтому вам нужно поднять определение cl_shared в отдельный заголовок, который использует ваш основной файл и файл my_mov_avg.cpp. – Shaggi