Avatar billede krismort Nybegynder
28. december 2002 - 17:18 Der er 2 kommentarer

ptr til funk i klasse, virker ikke :(

class CFunctor
{
public:
      virtual void operator()(...) =0;  // call using operator
};

template <class T>
class TSpecFunctor : public CFunctor
{
private:
    void (T::*fpt)(...);                // pointer to member function
    T* pt2Object;                    // pointer to object
public:
    TSpecFunctor(T* _pt2Object, void(T::*_fpt)(...)) {
        pt2Object = _pt2Object; 
        fpt=_fpt;
    };

    virtual void operator()(...) {
        (*pt2Object.*fpt)();
    };
};


class C {
public:

    void Func(int v1, int v2 ) {
        cout << "C::Func("<<v1<<")("<<v2<<")"<<endl;
    };
};


int main() {
C c;

TSpecFunctor <C> Func(&c,(void (C::*)(...)) C::Func);
Func(3,4);

return 0;
}

Hvorfor virker flg. ikke ?
Avatar billede krismort Nybegynder
28. december 2002 - 17:19 #1
sorry, spørgsmålet lyder mere på HVORDAN jeg for det til at VIRKE, ikke så meget hvorfor. Det er vel pga. calling convention der skifter fra __thiscall til __stdcall eller noget lign.
Avatar billede ultik Nybegynder
29. december 2002 - 02:25 #2
Umiddelbart må du ikke lave pointere til klassemedlemmer fordi der ikke bliver lavet en kopi til hver instance af din klasse, og fordi klassens instance altid skal kunne ses fra objektet.. Dette kan løses ved at lave member-functionen static.... Men jeg er dog ikke sikker på at det er løsningen for dig lige der... Jeg kan ikke helt gennemskue din kode dog. Måske kan du bruge det nedenstående istedet:

class CFunction {
public:
      virtual void operator()(...) =0;
}

class EnFunktion : public CFunction
{
public:
      void operator()(...)
      {
          /* Her skal du behandle dine dynamiske argumenter og trække de ints du vil have, ud */
          cout << "din kode" << "her" << endl;
      };
}

class EnAndenFunktion : public CFunction
{
public:
      void operator()(...)
      {
          cout << "andet kode" << "her" << endl;
      };
}


class FunctionCaller
{
public:
    FunctionCaller(CFunction *obj)
    {
            object = obj;
    }

    void Activate(int x, int y)
    {
          // brug funktionens operator
          (*object)(x,y);
    }
   
private:
    CFunction *object;
}

int main()
{
    EnFunktion K;
    EnAndenFunktion H;

    FunctionCaller P(&K);
    FunctionCaller Q(&H);

    P->Activate(3,4);
    Q->Activate(5,6);
}
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