Fonctions membres statiques ont été ajoutés en C++, en 1989, dans la Version 2.0 de l'AT&T Langage C++ (Système de pré-normalisation). Avant cela, l' static
mot-clé ne peut être utilisée pour déclarer des fonctions de membre statique, de sorte que les auteurs de code utilisé des solutions de contournement, principalement celui que vous avez observé de indirecting un pointeur null.
Dans les valeurs Sélectionnées accompagnant la version 2.0 de l'AT&T C++ Système de la Langue, dans la section 1-22, Stroustrup écrit:
Il a également été observé que les non-compatibles de code, tels que:
((X*)0)->f();
a été utilisé pour simuler les fonctions membres statiques. Ce truc est une bombe à retardement, car tôt ou tard, quelqu'un va faire une f()
qui est utilisé de cette façon, virtual
et l'appel échouera horriblement car il n'y a pas d' X
objet à l'adresse zéro. Même lorsqu' f()
n'est pas virtuelle de tels appels échouent dans certaines implémentations de la liaison dynamique.
Votre code a été écrit pour compiler sous Cfront 1.0 ou par quelqu'un qui n'était pas au courant au moment de l'ajout de fonctions membres statiques de la langue.
L'annotation de la fonction de membre avec static
est en effet un casse-tête, comme des Acclamations et des hth. - Alf a observé; Cfront 1.0 aurait rejeté ce code:
error: member Method() cannot be static
il ne peut donc pas avoir été là au départ. Je pense que Potatoswatter est probablement correct; static
a été ajouté à une date ultérieure pour documenter et appliquer la méthode statique d'attribut de l' Method
, une fois qu'un compilateur C++ 2.0 pourrait être assuré, mais sans le code d'appel en cours de mise à jour. Pour confirmer cela, vous auriez besoin d'interroger l'origine programmeur(s) ou au moins d'examiner de contrôle de la source de l'histoire (s'il existe).