У меня есть класс Cache, используемый в наборе инструментов (файл с различными общедоступными методами). Кэш обновляется с помощью обратного вызова, для которого требуется объект-функтор. Объект-функтор вызывает одну из функций Cache, refresh() в экземпляре Cache в моем наборе инструментов.C++, включая заголовочный файл в неназванном пространстве имен
Экземпляр находится в неназванном пространстве имен в наборе инструментов (поскольку я не хочу, чтобы клиенты имели прямой доступ к нему).
Теперь у меня было все это, но мне бы очень хотелось, чтобы у Cache был свой собственный заголовочный файл, чтобы понять, какие методы доступны на нем.
Моя проблема заключается в том, что у меня есть следующие:
// toolkit.cxx
#include "cache.h"
// Can't define operator()() here since it needs access the to cache instance
struct Functor {
void operator()();
};
// Define Cache's fucntions here (including use of Functor)
namespace {
Cache cache;
// This gives a compiler error - definition of operator Functor::()() is not in namespace enclosing 'Functor'
void Functor::operator()() {
cache.refresh();
}
}
Так что я не могу определить Functor::operator()()
внутри безымянного пространства имен, и он не может выйти наружу либо.
Одно из решений, которое я рассмотрел, заключается в том, чтобы довести всю партию внутри неназванного пространства имен, но это также должно включать #include
. Это рекомендуется? Это не то, что я действительно видел раньше (что предполагает, что это может быть плохой план ...), и я не мог найти много информации о плюсах и минусах такого подхода.
Это решение будет выглядеть так:
// toolkit.cxx
namespace {
#include "cache.h"
Cache cache;
struct Functor {
void operator()() {
cache.refresh();
};
// Define Cache's fucntions here (including use of Functor)
}
Может кто-нибудь прокомментировать плюсы/минусы (особенно минусы) этого второго подхода? Любые альтернативные решения также будут приветствоваться
Вы должны иметь возможность реализовать 'void Functor :: operator()()' вне анонимного пространства имен ', используя тот же код. Это не работает для вас? –
ahh да, я не знаю, почему я думал, что это должно быть либо перед пространством имен, либо внутри него - реализовать его после того, как пространство имен работает нормально. Благодаря! – rbennett485
Если вы хотите выразить это как ответ, я могу принять его – rbennett485