2010-08-24 9 views
0

File1.hRun résolution temporelle C++ conflits Namespace

// Declaration 
Class A 
{ 
void Func(); 
} 
//Along with some other stuff 

file1.cpp

//Definition 
A::Func() 
{ 
} 

// Along with some other stuff 

File2.h

class A 
{ 
void Func(); 
} 

File2.cpp

// Definition 
File2::A::Func() 
{ 
} 

File3.cpp 
#include "File1.h" 
#include "File2.h" 
// 
Invokes Func() 

Main1.cpp Main2.cpp

Main1.cpp File3.cpp et File2.cpp sont construits ensemble
Main1.cpp File3.cpp et File1.cpp sont construits ensemble
Je veux invoquer Func() en fonction de différer Mais, cela me donne une erreur de compilation.
Comment devrais-je contourner l'erreur de compilation?
Existe-t-il un moyen standard de contourner le problème?

Si j'utilise un espace de noms pour File1 et File2, je ne pourrai pas invoquer dynamiquement. Note: Je ne peux pas changer File1.h

+0

Vous pouvez inclure l'erreur de compilation dans votre question. – imaginaryboy

+3

Pouvez-vous expliquer davantage comment vous espérez utiliser ces définitions de classe en double et «invoquer dynamiquement»? À l'heure actuelle, cela ressemble à quelque chose qui ne fonctionnera jamais comme souhaité. – TheUndeadFish

+1

File1 et File2 ne sont pas des espaces de noms. Il n'y a pas de résolution d'exécution des espaces de noms. La classe en C++ commence comme "class" et non "Class". Définition de la fonction doit spécifier le type de retour et ainsi de suite ... – Chubsdad

Répondre

0

Contrairement à Java (pour un exemple), qui impose une correspondance 1: 1 entre les classes et les noms de fichiers, C++ ignore complètement les noms de fichiers complètement. Ainsi, pour résoudre le conflit entre vos deux classes (tous deux nommés A), vous pouvez utiliser les espaces de noms:

//file1.h: 
class A 
    void Func(); 
}; 

//file1.cpp: 
A::Func() {} 

//file2.h: 
namespace f2 { 
class A { 
    void Func(); 
}; 
} 

// file2.cpp: 

namespace f2 { 
    A::Func() {} 
} 

// main.cpp 
#include "file1.h" 
#include "file2.h" 

int main() { 
    A f1a; 
    f2::A f2a; 

    f1a.Func(); // invokes Func declared in file1.h, which is in global namespace 
    f2a.Func(); // invokes Func declared in file2.h, which is in namespace f2 
    return 0; 
} 

Il est pas clair ce que vous entendez en invoquant dynamiquement. L'appel dynamique ressemble beaucoup à l'utilisation d'une fonction polymorphe, ce qui nécessite une classe de base commune:

struct base { 
    virtual void Func() = 0; 
}; 

struct A1 : public base { 
    virtual void Func() {} 
}; 

struct A2 : public base { 
    virtual void Func() {} 
}; 

int main() { 
    A1 a1; 
    A2 a2; 
    base *b[2] = { &a1, &a2 }; 

    b[0]->Func(); // invokes A1::Func() 
    b[1]->Func(); // invokes A2::Func() 
    return 0; 
}