17 votes

C++ Plusieurs classes avec le même nom

Disons que j'ai deux fichiers cpp différents. Les deux déclarent des classes avec le même nom, mais peut-être une structure totalement différente (ou peut-être la même structure, une implémentation différente). Les classes n'apparaissent pas dans les fichiers d'en-tête. (A titre d'exemple, supposons qu'il s'agisse de classes Node pour des classes de listes différentes).

J'ai vu ces classes en conflit. Est-ce que cela est prévu par la norme ? Quelles sont les solutions à ce problème ?

UPDATE :

Comme suggéré par les réponses/commentaires, les espaces de noms anonymes sont ce que je recherchais.

25voto

Will A Points 16763

La façon standard de contourner ce problème est d'envelopper les classes dans des classes différentes. espaces de noms .

11voto

Ian Yang Points 821

Il viole Règle de la définition unique . Il est difficile pour le compilateur de détecter l'erreur, car ils sont dans des unités de compilation différentes. Et même le linker ne peut pas détecter toutes les erreurs.

Voir un exemple dans http://www.cplusplus.com/forum/general/32010/ . Mon compilateur et mon éditeur de liens (g++ 4.2.1) peuvent construire l'exécutable final sans aucune erreur, mais la sortie est erronée.

Si je change un peu l'exemple, j'obtiens un défaut de segmentation.

// main.cpp
#include <iostream>
#include <list>
using namespace std;

struct Handler
{
    Handler() : d(10, 1.234) {}
    list<double> d;
};

extern void test_func();

int main(void)
{
    Handler h;
    cout << h.d.back() << endl;
    test_func();
    return 0;
}

// test.cpp
#include <iostream>
#include <string>
using namespace std;

struct Handler
{
    Handler() : d("test Handler")  {}
    string d;
};

void test_func()
{
    Handler h;
    cout << h.d << endl;
}

Il est recommandé de différencier votre classe par espace de nom. Par exemple pour Node, vous pouvez utiliser la classe nest et définir le Node dans la classe parent list. Ou vous pouvez ajouter votre classe dans un espace de nom anonyme. Voir Comment un type qui n'est utilisé que dans une seule unité de compilation peut-il violer la règle de la définition unique ?

6voto

GI30065 Points 21

Je ne sais pas si j'ai raté un détail ici, mais il faut envelopper chaque classe dans un fichier de type namespace .

namespace A {
    class Node { };
}

namespace B {
    class Node { };
}

Vous pouvez alors utiliser A::Node ou B::Node .

6voto

sshah Points 176

Vous pouvez utiliser l'espace de noms pour avoir plusieurs classes avec le même nom en les sous-classant dans différents espaces de noms. Voir : http://www.cplusplus.com/doc/tutorial/namespaces/

4voto

Billy ONeal Points 50631

J'ai vu ces classes en conflit. Est-ce que cela est prévu par la norme ?

La norme dit que vous ne pouvez pas faire ça. Cela violerait la règle de la définition unique. (La façon de résoudre ce problème a déjà été abordée dans d'autres réponses).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X