Как сделать функцию пространства имен недоступной на стороне клиента - PullRequest
2 голосов
/ 28 апреля 2019

Я пишу класс, который обернут в namespace с именем cs. Я использую библиотеку, одна из функций которой занимает function pointer. Функция должна модифицировать некоторые из защищенных членов класса, поэтому я написал свободную функцию в том же пространстве имен cs и сделал ее friend function класса. Это позволило клиентам использовать эту функцию. Но функция ДОЛЖНА быть недоступна для клиента по очевидным причинам.

Пример кода здесь:

#include "lib.h"
namespace cs{
   class A
   {
     protected:
      int x;
      float y;
      friend int myFunc(void* userdata, int valInt, float valFloat);
     public:
      void abc()
      {
        libFunc(this, myFunc);
      }    
   };
   void myFunc(void *userdata, int x, float y){
       // I would like this function to be inaccessible from the client
       A *obj = (A*) userdata;
       obj->x = x;
       obj->y = y;
     }
}

1 Ответ

3 голосов
/ 28 апреля 2019

Если вы хотите сделать бесплатную функцию недоступной в другом модуле компиляции, вы можете использовать вложенное анонимное пространство имен :

namespace cs{

   class A
   {
     protected:
        //...
        friend int myFunc(int valInt, float valFloat);
     public:
        void abc();
   };

   namespace {  // anonymous nested namespace
        int myFunc(int x, float y){
           ...
     }
   }

   void A:: abc() {
        libFunc(this, myFunc);
   }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...