Avatar billede krismort Nybegynder
31. august 2005 - 18:58 Der er 15 kommentarer

definering af statisk string

Hej,
Er det ikke muligt at definerer en statisk string member i en klasse et andet sted i et cpp document ?

Har man ikke nogen mulighed for at deklarerer en static string og så angive den værdi den skal have direkte i header filen ?

feks:
class C {
  static std::string MyString("asdad");
};
Avatar billede arne_v Ekspert
31. august 2005 - 19:37 #1
det plejer compileren vist at brokke sig over

er det et problem at initialisere udenfor ?
Avatar billede bertelbrander Novice
31. august 2005 - 21:34 #2
Det der kommer nærmest er vist:
class C
{
public:
  static std::string MyString()
  {
      return "asdad";
  }
};

int main()
{
  C c;
  std::cout << c.MyString() << std::endl;
}
Avatar billede krismort Nybegynder
01. september 2005 - 14:34 #3
bertelbrander: Ja det er self. en mulig løsning.

arne_v: Problemet er at jeg gerne vil lave noget som jeg kan deklarerer og definerer med en enkelt macro fordi at der er mulighed for at jeg fx. har muligheden for at erstatte strengen med en konst enum ved blot at ændre på macro'en.
Avatar billede lars314 Nybegynder
01. september 2005 - 15:18 #4
Hvis du erstatter en streng med en enum, så bliver du da nød til at omskrive alt hvad der referer til den.
Derfor må det arbejde der ligge i at rette både i header og i cpp filen være forsvindene lille i forhold til de resternde rettelser.

Mest interresant er nu, hvad det er du vil opnå. Det kan være at der findes en bedre løsning en den du tænker på.
Avatar billede krismort Nybegynder
01. september 2005 - 16:33 #5
lars314:
Det er det som er pointen ved at bruge macro'er... så er du fri for at omskrive ting ;) Det som jeg vil opnå er at kunne skifte fra strenge til enums pga optimering.
Avatar billede krismort Nybegynder
01. september 2005 - 19:29 #6
her er et eksempel:

#include <string>
#include <iostream>
#include <map>
using namespace std;
#define USE_STRING_AS_IDTYPE


#ifdef USE_STRING_AS_IDTYPE
    typedef std::string id;
#else
    enum ID_CODE {
        HENRY = 13,
        TORP,
        FRANZ,
        MOGENS,
        MADS,
        ROFUS
    };
    typedef ID_CODE id;
#endif

#ifdef USE_STRING_AS_IDTYPE
    void addstring(std::string uniqueid) {
        static std::map<std::string, int> mEnumMap;
        static int nextid = 0;
        if(mEnumMap.find(uniqueid)!=mEnumMap.end()) {
            return;
        }
        mEnumMap[uniqueid] = nextid++;
    }
#endif


#ifdef USE_STRING_AS_IDTYPE
    #define ID(NAME) \
    addstring(#NAME) \
    std::string((const char*)#NAME)
#else
    #define ID(NAME) NAME
#endif

class SomeClass {
public:
    SomeClass(id uid) {
        mUniqueId = uid;
    }
    id getId() {
        return mUniqueId;
    }
    id mUniqueId;
};


void main() {
    SomeClass c(ID(HENRY));
    cout << "uid = " << c.getId() << endl;
    system("PAUSE");
}
Avatar billede arne_v Ekspert
01. september 2005 - 19:30 #7
er det ikke sådan noget templates er til for ?
Avatar billede krismort Nybegynder
01. september 2005 - 19:32 #8
det er så meningen at man arbejder med strenge under udviklingen og man vil så kunne bruge  addstring til at skrive sin enum i formateret format ud til en header fil som vil kunne inkluderes i til projektet når man skrifter om. på den måde er man fri for selv at skulle definere ID_CODE når blot man altid veksler mellem at bruge strenge i udviklingen og integers til id's i release.
Avatar billede krismort Nybegynder
01. september 2005 - 19:33 #9
arne_v: prøv og giv et eksempel ?
Avatar billede krismort Nybegynder
01. september 2005 - 19:36 #10
det som er vigtigt at nævne er entligt osse at templates ikke kan bruges fordi programmet skal arbejde sammen med et scriptsprog(lua) hvor al konkret logik for instanser af abstrakte entiteter bliver udført.
Avatar billede arne_v Ekspert
01. september 2005 - 19:37 #11
det bedste eksempel jeg havde på lager var:

#include <iostream>

using namespace std;

template <typename T>
class Test
{
    private:
        T v;
    public:
        Test(T v) { this->v = v; };
        T testing (int i);
};

template <typename T>
T Test<T>::testing(int i)
{
    return i*v;
}

int main ()
{
    Test<int> t1(123);
    cout << t1.testing(2) << endl;;
    Test<double> t2(123.456);
    cout << t2.testing(2) << endl;;
    return 0;
}
Avatar billede arne_v Ekspert
01. september 2005 - 19:38 #12
da jeg ikke kender LUA kan jeg ikke vurdere templates i forbindelse med LUA
Avatar billede krismort Nybegynder
01. september 2005 - 20:38 #13
Problemet er osse at jeg arbejder med en kæmpe kodebase og jeg mener at det vil være en skummel løsning at definerer alt som templates.

Jeg er jo stadig ikke ovre problemet med at skulle angive id type i dit eksempel. man er jo nød til at angive en double eller en streng i constructoren Test(T v). ( med mindre du selv bruger en macro ala den som jeg har noteret. )

Pointen osse at optimere hasigheden i "final release", er der ikke noget med at performance på templates er ret langsomme ?
Avatar billede arne_v Ekspert
01. september 2005 - 20:40 #14
der burde ikke være noget performance overhead ved templates i forhold til makro
Avatar billede arne_v Ekspert
29. september 2005 - 20:36 #15
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester