Ultima modifica:
Ciao, sto lavorando ad un progetto cosi' strutturato:
Quello che vorrei fare e' linkare Engine.lib solo con l'eseguibile principale e poi passare un puntatore alle altre librerie del progetto in fase di inizializzazione. Il problema e' che se linkassi Engine.lib a tutto il resto avrei delle ripetizioni inutili dato che le altre lib non devono instanziare una "MyClass" ma devono solo chiamare dei metodi al suo interno per cui non hanno bisogno di portarsi dietro l'implementazione anch'esse ma solo includere il file header.
Secondo voi qual e' il modo piu' elegante per farlo?
L'unica cosa che mi e' venuta in mente e' dichiarare un "interfaccia" come classe astratta con metodi pure virtual "IMyClass", una cosa del tipo:
E quindi passando alle altre lib/dll un puntatore a IMyClass e loro potrebbero usarla avendo solo il file header. Esiste un altro modo? Perche' questa classe espone attualmente 70 metodi pubblici, potrebbero aumentare e questo approccio e' incline ad errori, magari aggiorno la classe (sia aggiundendo/togliendo un metodo o cambiandone la signature) e dimentico di aggiornare l'interfaccia ecc.
Non posso convertire Engine in dll. Deve essere necessariamente statico.
- Static library "Engine.lib"
- Eseguibile principale
- Dynamic library 1
- Static library 1
- ... Static library N
Quello che vorrei fare e' linkare Engine.lib solo con l'eseguibile principale e poi passare un puntatore alle altre librerie del progetto in fase di inizializzazione. Il problema e' che se linkassi Engine.lib a tutto il resto avrei delle ripetizioni inutili dato che le altre lib non devono instanziare una "MyClass" ma devono solo chiamare dei metodi al suo interno per cui non hanno bisogno di portarsi dietro l'implementazione anch'esse ma solo includere il file header.
Secondo voi qual e' il modo piu' elegante per farlo?
L'unica cosa che mi e' venuta in mente e' dichiarare un "interfaccia" come classe astratta con metodi pure virtual "IMyClass", una cosa del tipo:
C++:
class IMyClass
{
public:
IMyClass() = default;
virtual ~IMyClass() = default;
virtual int Method1() = 0;
virtual void Method2() = 0;
// ...
};
class MyClass : public IMyClass
{
public:
MyClass();
int Method1() override;
void Method2() override;
//...
}
E quindi passando alle altre lib/dll un puntatore a IMyClass e loro potrebbero usarla avendo solo il file header. Esiste un altro modo? Perche' questa classe espone attualmente 70 metodi pubblici, potrebbero aumentare e questo approccio e' incline ad errori, magari aggiorno la classe (sia aggiundendo/togliendo un metodo o cambiandone la signature) e dimentico di aggiornare l'interfaccia ecc.
Non posso convertire Engine in dll. Deve essere necessariamente statico.