Avatar billede jonashn Nybegynder
08. december 2007 - 21:49 Der er 10 kommentarer og
1 løsning

Bedste design til at passe funkion til objekt

Tjaa, ved godt titlen lyder ret mærkelig, men jeg håber den bliver lidt klarere når jeg forklarer den.

Jeg har et objekt, som bliver brugt af min form til at styre nogle Instant Messaging funktioner.. Jeg vil prøve at illustrere det herunder:

    public ref class Form1 : public System::Windows::Forms::Form
{
public:
    insertTextInForm(char*)
...
private:
ImCtrl im;
}

Form1::Init
{
...
im->recv_callback=&insertTextInForm;
}

så hvergang imCtrl modtager noget kører den recv_callback(buffer).

Det er hamrende dårligt design, og kompilerer self. ikke.

Jeg går ud fra at alternativet er (pure) virtuelle funktioner.
Men så vidt jeg ved kan man ikke erklære en medlemsfunktion virtuel og så definere den uden nedarvning, hvilket jeg ikke gider at begynde at bøvle med.

Nogle idéer til løsning af problemet?

Da jeg er i tidsnød giver jeg 100 point.
Avatar billede jonashn Nybegynder
08. december 2007 - 21:50 #1
..og koden er bare sample, det er derfor der mangler alle return typer osv.
Avatar billede intel4004 Novice
08. december 2007 - 23:06 #2
Pointers til c++ member-functions kan lade sig gøre. Men det har sine begrænsninger så vidt jeg husker.

Er du bekendt med "functor" begrebet?:
http://en.wikipedia.org/wiki/Function_object

Der er også mange tutorials om pointere til c++ member-functions. En af dem: http://linuxquality.sunsite.dk/articles/memberpointers/

Måske kan det hjælpe. Kan dog være det er noget helt du mener?

Mvh Intel4004
Avatar billede bertelbrander Praktikant
09. december 2007 - 00:12 #3
Hvorfor ikke bare lave en class med en member og give Form1 en pointer til denne class.
Om du behøver at lave funktionen pure og/eller virtual afhænger mere af hvor fleksibelt det skal være.
Hvis Form1 godt må kende den class der har funktionen og det altid er den samme class, behøver du hverken pure eller virtual.

(Din kode er i øvrigt ikke C++, men jeg går ud fra at dit sprog opfører sig som C++ på dette punkt.)
Avatar billede arne_v Ekspert
09. december 2007 - 00:41 #4
Så vidt jeg kan se bruger du managed C++ også kaldet C++ CLI.

Det understøtter delegates og jeg tror at det er hvad du bør bruge til den problem
stilling.
Avatar billede arne_v Ekspert
09. december 2007 - 03:28 #5
Følgende kode er ikke specielt meningsfyldt men det viser delegates på alle mulige måder:

#using <mscorlib.dll>

using namespace System;

delegate void Process(int v);

ref class Doer
{
    public:
        int i;
        Process^ p1;
        Process^ p2;
        Process^ p3;
        Process^ p4;
        Process^ p5;
        Process^ p6;
        void ProcessAll();
        void InstantP(int v);
        static void ClassP(int v);
};

ref class Other
{
    public:
        void InstantP(int v);
        static void ClassP(int v);
};

void Doer::ProcessAll()
{
    p1(i);
    p2(i);
    p3(i);
    p4(i);
    p5(i);
    p6(i);
}

void Doer::InstantP(int v)
{
    Console::WriteLine("Doer::InstantP v=" + v + " (i=" + i +")");
}

void Doer::ClassP(int v)
{
    Console::WriteLine("Doer::ClassP v=" + v);
}

void Other::InstantP(int v)
{
    Console::WriteLine("Other::InstantP v=" + v);
}

void Other::ClassP(int v)
{
    Console::WriteLine("Other::ClassP v=" + v);
}

void OldStyle(int v)
{
    Console::WriteLine("OldStyle v=" + v);
}

int main()
{
    Doer^ a = gcnew Doer();
    a->i = 123;
    a->p1 = gcnew Process(&Doer::ClassP);
    a->p2 = gcnew Process(a, &Doer::InstantP);
    Doer^ a2 = gcnew Doer();
    a2->i = 456;
    a->p3 = gcnew Process(a2, &Doer::InstantP);
    Other^ b = gcnew Other();
    a->p4 = gcnew Process(&Other::ClassP);
    a->p5 = gcnew Process(b, &Other::InstantP);
    a->p6 = gcnew Process(&OldStyle);
    a->ProcessAll();
    return 0;
}
Avatar billede jonashn Nybegynder
09. december 2007 - 07:59 #6
Genialt, Arne V, nu forstår jeg det! Smid et svar!
Avatar billede jonashn Nybegynder
09. december 2007 - 08:00 #7
-og tak for svarene alle i andre. Bertelbrander-> Ved godt koden ikke er c++, men jeg skrev bare lildt lookalike ned på 5 sek:)
Avatar billede arne_v Ekspert
09. december 2007 - 17:04 #8
svar
Avatar billede bertelbrander Praktikant
09. december 2007 - 19:54 #9
Det var mest "public ref class Form1" jeg tænkte på, det er ikke C++, men som Arne skriver, C++/CLI
Avatar billede jonashn Nybegynder
21. december 2007 - 15:52 #10
Ahh, det har du ret i. Egentlig hader jeg C++/CLI, jeg mener at det kan undværes. MEN visual C++ express er det bedste IDE atm.

Jeg startede med WxWidgets. Overvej det her: En totalt empty form fyldte 7 MB. Det er sikkert p.g.a den statiske linkning, men det er alligevel lidt meget!
Avatar billede arne_v Ekspert
21. december 2007 - 16:23 #11
Det er p.g.a. static link. Du kunne ogsaa linke dynamisk og distribuere DLL'er. Men
det fylder naturligvis ogsaa.

.NET runtime fylder endnu mere (20 MB som komprimeret install kit).

Men forskellen er at MS sender .NET runtime ud med Windows update, saa du
efterhaanden kan regne med at der "bare er der".
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

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