2016-03-15 2 views
1

У меня есть класс 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) 
} 

Может кто-нибудь прокомментировать плюсы/минусы (особенно минусы) этого второго подхода? Любые альтернативные решения также будут приветствоваться

+0

Вы должны иметь возможность реализовать 'void Functor :: operator()()' вне анонимного пространства имен ', используя тот же код. Это не работает для вас? –

+0

ahh да, я не знаю, почему я думал, что это должно быть либо перед пространством имен, либо внутри него - реализовать его после того, как пространство имен работает нормально. Благодаря! – rbennett485

+0

Если вы хотите выразить это как ответ, я могу принять его – rbennett485

ответ

0

Solution 1

DEFINE Functor в анонимной namespace.

#include "cache.h" 

namespace { 

    Cache cache; 

    struct Functor { 
     void operator()() { 
     cache.refresh(); 
     } 
    }; 
} 

Решение 2

Определение Functor после определения анонимного namespace.

#include "cache.h" 

namespace { 

    Cache cache; 

} 

struct Functor { 
    void operator()() { 
     cache.refresh(); 
    } 
}; 

Решение 3

Объявить Functor перед анонимным namespace но определить Functor::operator() после определения анонимного namespace.

#include "cache.h" 

struct Functor { 
    void operator()(); 
}; 

namespace { 

    Cache cache; 

} 

void Functor::operator()() { 
    cache.refresh(); 
} 
Смежные вопросы