У меня проблема с библиотекой C ++, которую я пытаюсь написать. Это обычная настройка, один файл cpp, один файл заголовка. Я хочу, чтобы файл заголовка отображал только те части, которые предназначены для использования (например, у меня есть абстрактный базовый класс, я не хочу в файле заголовка). Пока что я просто работаю с одним файлом (я полагаю, что это не должно иметь никакого значения, поскольку включения выполняются препроцессором, который ни о чем не заботится).
Вы заметите, что «файл заголовка» расположен в двух местах, до и после файла реализации заголовка.
#include <stdio.h>
// lib.h
namespace foo {
template <class T> class A;
}
// lib.cpp
namespace foo {
template <class T> class A {
private:
T i;
public:
A(T i) {
this->i = i;
}
T returnT() {
return i;
}
};
};
// lib.h
namespace foo {
template <class T> T A<T>::returnT();
}
// foo.cpp
void main() {
foo::A<int> a = foo::A<int>(42);
printf("a = %d",a.returnT());
}
Итак, естественно, я бы хотел, чтобы мой заголовочный файл содержал только
namespace foo {
template <class T> class A;
template <class T> T A<T>::returnT();
}
Но моему компилятору это не нравится (он жалуется, что returnT
не является членом foo::A<T>
. Причина, по которой я не хочу помещать объявление класса в заголовок, заключается в том, что тогда это произойдет (как я поймите это), содержат все личные и подобные вещи, которые я хотел бы скрыть.
Может быть, это только я, но следующий заголовочный файл кажется "плохим", по крайней мере, как "спецификация интерфейса". Он раскрывает некоторые из внутренних элементов A
, о которых пользователю библиотеки не нужно знать.
// lib.h
namespace foo {
template <class T> class A {
private:
int i;
public:
A(T);
T returnT();
};
}
// lib.cpp
namespace foo {
template <class T> A<T>::A(T i) {
this->i = i;
}
template <class T> T A<T>::returnT() {
return i;
}
};
Это приемлемый способ сделать это? Я бы хотел более абстрактный заголовочный файл, если это вообще возможно.