2017-01-31 23 views
5

The Principle Engineer у моей последней компании было правило, что методы privatestatic должны быть реализованы как функции в файле реализации, а не как методы класса.Есть ли необходимость в частных статических методах?

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

Этого достаточно, чтобы направить меня когда-либо, используя privatestatic метод снова, но прежде чем я написал их, я хотел бы знать, если кто-нибудь знает о нише они заполняют, что функция файл реализации не будет?

EDIT:

Примером может быть полезным здесь. Скажем, это начало декларации class Foo, что есть и другие методы, которые будут вызываться void foo() в файле реализации:

class Foo { 
    static void foo(); 

Так foo доступен только другими методами Foo. Почему бы мне просто не определить foo в файле реализации и сохранить его из заголовка вместе?

+0

@Downvoter Есть ли причина для голосования? Очевидно, что если вы просто предоставляете обязательное голосование по вопросам [tag: C++], нет необходимости отвечать. –

+1

Доступ к частным статическим данным (например, количеству созданных экземпляров) потребует метода класса, а не бесплатной функции. –

+0

Итак, как бы это отличалось, если метод был «public» или «protected»? Правило, указанное в вашем вопросе, не объясняет, почему «частный» получает особое обращение. –

ответ

2

Функции членов имеют доступ ко всем private членам класса. Если функция нуждается в доступе к этим членам, она должна быть членом. Это относится к тому, является ли оно static.

A static Функция - это функция, которая не работает на конкретном объекте. Тем не менее, он все равно может принимать объекты в качестве параметров. Например:

class A 
{ 
    int m; 

    static int process_3_objects_in_some_way(A x, A y, A z) 
    { 
     return x.m + y.m + z.m; 
    } 
} 

Еще одна причина, чтобы функция static есть порядок параметров. Например, print:

class A 
{ 
    int m; 

    static void print(std::ostream& stream, A x, int options) 
    { 
     stream << "Value is: " << (x.m * 1000000 + options); 
    } 
} 
+0

Я предполагаю, что ваш второй пример должен сказать 'x.m' не' m'? Хорошие примеры. –

+0

Да; исправлено ..... – anatolyg

+0

Просто держитесь, потому что это лучшие примеры, и я бы хотел, чтобы мой принятый ответ был как минимум компилируемым, я думаю, вы также хотели, чтобы 'print' возвращал' ostream & 'право? –

11

В отличие от автономных функций static в файле реализации частные частные функции-члены могут использоваться в заголовке класса. Это важно в тех случаях, когда вы хотите, чтобы встраивать незакрытую функцию, которая вызывает вашу личную статическую функцию:

class Demo { 
private: 
    static std::string sanitize(const std::string& name); 
    std::string name; 
public: 
    Demo(const std::string& n) : name(sanitize(n)) { 
    } 
}; 

делать то же самое с Самоустойчивым статические функции потребует реализации Demo «s конструктора в CPP файл.

+0

Это фантастический пример. Поэтому, возможно, исключение должно быть: «Когда функция не нужна в заголовке». –

+1

@JonathanMee Да, я следил за этим правилом еще в мои дни C++. Что-то вроде «Предпочитайте постоянные статические функции и статические переменные для статических функций-членов и статических переменных-членов, за исключением случаев, когда вам нужно использовать их в заголовке класса». – dasblinkenlight

+0

Это лучше сказано, чем мои фальсификации, о чем ясно свидетельствуют последние пояснения по моему вопросу. –

1

friend Функции или классы, которые реализованы в другом файле реализации, являются еще одним примером, когда требуется частная статическая функция-член.

+0

'friend' на самом деле не то, что я искал, но я полагаю, что это прекрасный пример исключения из этого правила. –

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

  • Нет связанных вопросов^_^