У меня возникла проблема с библиотекой C++, которую я пытаюсь написать. Это обычная настройка, один файл cpp, один заголовочный файл. Я хочу, чтобы заголовочный файл отображал только те части, которые предназначены для использования (например, у меня есть абстрактный базовый класс, я не хочу в файле заголовка). Пока что я просто работаю с одним файлом (я предполагаю, что это не имеет никакого значения, так как это включает препроцессор, который ни о чем не заботится).Декларации и пространства классов C++
Вы заметите, что «файл заголовка» распространяется на два места до и после файла реализации заголовка.
#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;
}
};
Это приемлемый способ сделать это? Я бы хотел получить более абстрактный заголовочный файл, если это вообще возможно.
ли весь первый блок кода код заголовка файла? Я запутался, потому что есть два блока с надписью «lib.h», но тогда у вас есть функция «main» ... –
Привыкайте к раскрытию сведений о своей реализации при написании слова «шаблон». Вот как это работает, период. Вы можете сделать «файлы заголовков реализации», которые вы «включаете» в свой основной заголовок, но вы должны отправить исходный код. –
@ Джеймс Макнеллис: первый фрагмент кода (серый блок) - это всего лишь тестовый файл, который я использовал для хранения всего в одном файле. Идея состоит в том, что это будет разделено на три файла: lib.h', 'lib.cpp' и' main.cpp', последний из которых просто является «пользовательским» тестом, вызывая в 'lib'. Проблема только в том, что для получения чего-то похожего на то, что я хочу, мне нужно разбить заголовок на одну часть над кодом реализации и на одну часть ниже. Имеет ли это смысл? – Svend