Нельзя использовать ключевое слово «static» для статического метода в файле реализации класса c ++ (.cpp) - PullRequest
11 голосов
/ 12 января 2012

Рассмотрим:

// В Vector2.h

class Vector2
{
    public:
        // returns the degrees in radians
        static double calcDir(double x, double y);
}

// В Vector2.cpp

double Vector2::calcDir(double x, double y)
{
    double rad = ...;
    return rad;
}

Почему ключевое слово статический требуется в подписи в Vector2.cpp?Когда я пытаюсь это сделать, выдает ошибку:

static double Vector2::calcDir(double x, double y)

Мне кажется, что это противоречит.Все остальные части сигнатуры метода должны быть повторены в файле .cpp (возвращаемый тип, имя метода (duh), имена и типы аргументов, константность).Мне не нравится, если сразу не узнать, является ли метод статическим или нет (при рассмотрении реализации).

Есть ли причина, по которой это не только не требуется, но и запрещено?

Ответы [ 3 ]

17 голосов
/ 12 января 2012

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

За пределами класса static дает внутреннюю связь функции, но это недопустимо для (даже статических) функций-членов, потому что члены класса должны иметь такую ​​же связь, как и класс, членом которого они являются (почти всегда внешние, и, конечно, внешний в тех случаях, когда вы можете определить функции-члены вне определения класса).

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

1 голос
/ 21 сентября 2015

Раздражает, что ключевое слово приводит к вызову двух совершенно разных функций (глобальные-всем-экземплярам класса и локальным-файлам), но может пригодиться следующий небольшой заголовок.Макрос просто раскрывается в пустую строку, что означает, что вы можете прикрепить его перед объявлениями методов в файле реализации, а год спустя вернувшись к своему коду, вы избежите заливки 2000-строчного заголовка «boost-esque» ввыясните, почему компилятор не позволяет вам использовать это.

staticmethod.h:

/*
** macro sugar for maintaining readability
** of static methods in implementation files
*/
#ifndef STATICMETHOD
#define STATICMETHOD

В ваших файлах .cpp вы можете использовать:

#include "staticmethod.h"
STATICMETHOD double Vector2::calcDir(double x, double y)
{
    double rad = ...;
    return rad;
}
1 голос
/ 12 января 2012

Это, вероятно, чтобы уменьшить путаницу. В области видимости файла ключевое слово static (смущает) означает «использовать внутреннюю связь» (TC ++ PL, стр. 200). Это может означать, что функция, хотя и является членом класса, была видна только внутри текущей единицы перевода. Разрешение статического спецификатора было бы более запутанным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...