2014-12-22 3 views
0

Я изучаю C++ из фона java. Я хотел бы знать, как я могу создать частную функцию в пространстве имен?Как иметь частные функции в C++

Я хотел бы сделать это в CPP

Java:

public class Clazz { 
    public static void foo() { 
     // stuff 
    } 

    private static void bar() { 
     // other stuff 
    } 
} 

C++:

namespace clazz { 
    void foo(); 

    // what do I do here? 
} 
+1

Кто должен иметь возможность вызвать частную функцию пространства имен? – dreamlax

+0

Только foo должен иметь доступ к частной функции. – user1811367

+0

Эти два примера не эквивалентны. Первый - в области класса, другой области пространства имен. – 0x499602D2

ответ

0

Там нет частных функций в пространствах имен в C++. Как правило, люди используют пространство имен, специально для реализации конкретных деталей:

namespace clazz { 
    namespace detail { 
     void bar(); 
    } 

    void foo(); 
} 
+0

Как объявить/использовать панель? – user1811367

+0

@ user1811367 Изнутри 'foo()' вы бы назвали его как 'detail :: bar();'. To * define * 'bar()' вы бы просто сделали 'namespace detail {void bar() {/ * ...* /}} '(предполагая, что вы уже находитесь в' namespace clazz'). – cdhowie

+0

В этом примере 'bar' по-прежнему имеет внешнюю связь –

0

В функции на C++ class этот участник private по умолчанию.

можно утверждать, что в явном виде с помощью спецификаторадоступа, например:

private: 

Эффект длится до спецификатора следующего доступа в классе, или в конце определения класса.

Одно отличие от Java заключается в том, что частные члены C++ не являются окончательными. Когда они virtual, они могут быть переопределены в производных классах. В C++ функции-члены, предназначенные для переопределения, часто являются частными.


Пространства имён C++ недоступны.

Фактически, они все public.


Библиотека подталкивания использует соглашение, где вложенное пространство имен с именем detail следует рассматривать как деталь реализации, как если бы это были частные.

Более прямым наименованием может быть impl или implementation.

Такие соглашения достаточно, чтобы предотвратить непреднамеренно доступ и зависимость от деталей реализации.

1

Если вы хотите ограничить доступ к методу, отличному от экземпляра, вам нужно будет сделать его методом static для класса. Например. в C++:

class clazz 
{ 
    public: 
    static void foo(); 

    private: 
    static void bar(); 
}; 

Стоит отметить, что если вы используете только bar в одном файле .cpp, вы используете анонимные имена, чтобы предотвратить его от доступа в другом месте. Так что у вас есть что-то вроде:

clazz.h:

namespace clazz 
{ 
    void foo(); 
} 

clazz.каст:

#include "clazz.h" 

namespace 
{ 
    // bar can only be used in this file 
    void bar() { /* bar implementation */ } 
} 

void clazz::foo() { /* foo implementation */ } 
0

«C++ путь», чтобы решить эту проблему, чтобы использовать пространство имен, как вы сделали, и дать bar внутренней связи.

clazz::bar() будет доступен из любого источника в этом исходном файле, а не только от foo(). Хранение его внутри namespace clazzprotects against Murphy, not Machiavelli. Если эта видимость является подлинной проблемой, то вы можете либо:

  • отдельный код в более исходных файлов, так что этот файл содержит только foo и bar.
  • использовать class только статические функции-членов, как хак

Самого простой синтаксисом для внутренней связи является:

static void bar() { } 

хотя вы можете использовать анонимные имена вместо этого.

0

Исходя из Java, вы можете не понимать, что в C++ реализация часто находится в отдельном файле (.cpp, .cc) из объявления класса (.h, .hpp). Лучшее, что нужно делать с функциями утилиты, которые нужно только в одном файле cpp, - разместить их в анонимном пространстве имен .

namespace { 
void my_utility_function(const Something &something { 
    // bunch of code 
} 
} // close namespace 

Эта функция видна везде в этом файле CPP вперед, , но не в других местах. Таким образом, методы класса, которые нуждаются в my_utility_function, реализованы ниже.

Когда функция находится в названном пространстве имен, компоновщик собирается испускать данные для него и тратить время на поиск в другом месте программы. Даже если вы избегаете конфликтов имен (используя пространство имен), это пустая трата процессора. Это также документы, что это в основном частные. В C, один помечен как функция static с тем же эффектом, но static имеет много разных значений, а AFAIK - это анонимное пространство имен.

Вы можете вложить анонимное пространство имен в именованное пространство имен, если весь файл cpp живет в пространстве имен.

Смежные вопросы