Interesant kodi mė lart. Mė dha mundėsinė tė freskoja (dhe zgjeroja) njohuritė e C++. Pasi e studiova pėr disa minuta arrita ta kuptoja se ēfarė po mundohet tė bėjė programuesi.
Siē e shpjegojnė dhe komentet, qėllimi i ChooseCreatorClass ėshtė qė tė zgjedhė midis tipit _CreatorClass qė pėrmbahet brėnda tipit T dhe tipit tė parazgjedhur, Default. Pra, nėse tipi T nuk pėrmban _CreatorClass, atėherė ChooseCreatorClass pėrdor tipin Default.
Pėr ata qė dinė Java, kjo do ishte e thjeshtė duke pėrdorur reflektimet (reflection), por C++ nuk ka reflektime, kėshtu qė autori ka shkruajtur kodin e koklavitur mė sipėr i cili shfrytėzon rregullat e shtrirjeve (scope) pėr tė zgjedhur _CreatorClass e duhur.
Shtrati Global::
Krijojmė njė shabllon me dy parametra, tipin T dhe tipin Default (i parazgjedhur).
template
struct ChooseCreatorClass
{
Shtrati Global::ChooseCreatorClass
Riemėrtojmė tipin Default si _CreatorClass, i njėjti emėr me tipin qė pėrmban parametri T. Pra, krijojmė ChooseCreatorClass::_CreatorClass;
typedef Default _CreatorClass;
Kėtu krijojmė njė tip qė trashėgon nga tipi T me qėllim qė tė hyjmė nė shtratin (scope) tė tipit T. Pra, duam tė kontrollojmė nėsė ekziston T::_CreatorClass.
struct Derived : private T
{
Shtrati Global::ChooseCreatorClass::T::Derived
Riemėrtojmė tipin _CreatorClass si CreatorClass. Kėtu ndodh e gjithė magjia, sepse si rregull, nėse C++ nuk gjen tipin _CreatorClass nė shtratin e brėndshėm, duhet tė kėrkojė atė nė shtratin e jashtėm. Nėse nuk e gjen as aty, duhet tė kėrkojė nė shtratin tjetėr mė tė jashtėm, e kėshtu me radhė deri sa arrin nė shtratin Global. Nėse nuk gjendet as aty, pėrpiluesi nxjerr gabim. Konkretisht, nė kėtė rast C++ do kontrollojė mė parė shtratin Global::ChooseCreatorClass::T::Derived, pastaj Global::ChooseCreatorClass::T, pastaj Global::ChooseCreatorClass, pastaj Global. Pra, nėse T::_CreatorClass nuk ekziston, atėherė C++ do pėrdorė ChooseCreatorClass::_CreatorClass tė cilin e krijuam mė lart si emėrtim tė tipit Default.
typedef _CreatorClass CreatorClass;
};
Tashmė, Derived:CreatorClass pėrmban tipin e duhur, por e riemėrtojmė vetėm si CreatorClass me qėllim qė tė fshehim ndihmėsin Derived.
typedef typename Derived::CreatorClass CreatorClass; };
Kėtu kemi arritur pėrsėri nė shtratin Global:: dhe mund tė pėrdorim ChooseCreatorClass::CreatorClass ku T dhe Default janė parametrat.
Mė poshtė po hedh njė shembull qė vė nė provė shpjegimin mė lart.
Kodi PHP:
#include <iostream>
#include <string>
using namespace std;
class KlasaSakte {
public:
string merrPergjigjen() {
return "Klasa e sakte";
}
};
class KlasaMeKlasenSakte {
public:
typedef KlasaSakte _CreatorClass;
};
class KlasaPaKlasenSakte {};
class KlasaParazgjedhur {
public:
string merrPergjigjen() {
return "Klasa e parazgjedhur";
}
};
template <typename T, typename Default>
struct ChooseCreatorClass
{
typedef Default _CreatorClass;
struct Derived : private T
{
typedef _CreatorClass CreatorClass;
};
typedef typename Derived::CreatorClass CreatorClass;
};
int main(int argc, char *argv[])
{
// kjo duhet tė nxjerrė "Klasa e sakte"
ChooseCreatorClass<KlasaMeKlasenSakte, KlasaParazgjedhur>::CreatorClass sh1;
cout << sh1.merrPergjigjen() << endl;
// kjo duhet tė nxjerrė "Klasa e parazgjedhur"
ChooseCreatorClass<KlasaPaKlasenSakte, KlasaParazgjedhur>::CreatorClass sh2;
cout << sh2.merrPergjigjen() << endl;
cin.get();
return EXIT_SUCCESS;
}
Nė Microsoft C++ programi punon siē duhet dhe nxjerr pėrgjigjen e saktė:
Kodi:
Klasa e sakte
Klasa e parazgjedhur
ndėrsa Dev-C++ (gcc 3.4.2) nxjerr pėrgjigje tė gabuar:
Kodi:
Klasa e parazgjedhur
Klasa e parazgjedhur
Krijoni Kontakt