To datatyper: int og int

Tags:    c++

Jeg har lige åbnet Visual C++ og leget lidt med C++/CLI, som jeg gør en gang i mellem, og jeg må sige, jeg synes det er genialt. Syntaksen ER jo ikke helt som "almindelig" C++, men det gør som bekendt intet, for man kan jo springe frem og tilbage mellem disse to sprog, så meget man lyster.

Men så kommer jeg i tanker om, at .NET's System.Int32 varierer fra C og C++'s int, idet den har andre metoder (bla. den velkendte ToString) og i det hele taget andre muligheder.

Her kommer spørgsmålet: Hvad nu, hvis jeg af den ene eller anden grund ønsker at benytte C++'s int i stedet for .NET's int i mit C++/CLI program? Jeg kunne naturligvis lave et rendyrket C++-program, eller jeg kunne glæde mig over .NET's int og dens udvidede funktionalitet (hvilket jeg allerede gør), men det er jo så her, det går hen og bliver et teoretisk spørgsmål.

Modsat C#, har man i C++/CLI ikke adgang til string-datatypen, medmindre man benytter en "using", men using System eller ej, vil man altid kunne skrive (5).ToString(); i C++/CLI, og int-nøgleordet er der altså med det samme og fungerer som et alias for System::Int32.



Jeg ved meget lidt om emnet, så der er en del formodninger i følgende.

Jeg tror ikke du kan bruge ægte C++ data typer i C++/CLI.

C++/CLI er noget ganske andet en C++, og i mine øjne et overflødigt misfoster. Hvis man vil .net/CLI er der bedre at bruge C#



Det er sandt, men eksempelvis kan man stadig benytte char*, og den er jo ikke tilstede i .NET, hvor System.String nu styrer butikken. Det samme gælder wchar_t, men .NET har som bekendt ushort, så den gælder ikke helt.

Men jeg plejer også at vælge C# til mine .NET-applikationer. Selvfølgelig er vi nogle, der foretrækker Win32-API'et, men jeg er absolut også en stor tilhænger af C# og .NET.

Her kan du se, hvordan man kan lave C++ datatyper og C++/CLI datatyper, begge i samme program.

Fold kodeboks ind/udKode 


Koder du egentlig C#, Bertel?



Hvad nu hvis man ville overføre en int fra cppClass til cliClass? Eller man oprettede en instans af cppClass med new og en anden med gcnew? (Du behøver ikke svare, det er dit spørgsmål, jeg undrer mig bare.)

Nej, jeg koder ikke i C#, jeg ville egentlig gerne lære det, men men jeg vil også gerne lære mere Java, PHP og Ruby, "so little time so many languages".



Jeg vil vældig gerne svare, jeg lærer stortset altid noget af at snakke med dig. Jeg prøvede faktisk at bytte rundt på new og gcnew, og det blev compileren ikke glad for.

error C2726: 'gcnew' may only be used to create an object with managed type

Dette virker dog:

cli->value = cpp->GetNum();
cout << cli->value << endl;

Mit bud er, at int nu er alias for System::Int32, ligesom i C#. Det underlige ved det er dog, at selvom man skriver using namespace System, så skal man stadig skrive String for at benytte System::String. Det kunne være pga. std::string, det skal jeg ikke kunne sige.

Jeg forstår godt hvad du mener med så mange sprog og så lidt tid. For tiden har jeg dog rimelig meget fritid, og jeg er begyndt at kigge dybere på et par sprog, bla. C# og Masm32. Visual Studio's disassembly-funktion er helt genialt til at lære Assembly med. PHP har jeg kodet i lang tid, Java har jeg forsøgt mig lidt med for lang tid siden, uden held, og Ruby har jeg kun kigget meget lidt på. Men du kan da en del PHP, kan du ikke? Nu tænker jeg på din hjemmeside.


Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 19.07.2009 18:01 af Bruger #8985
Jeg havde overset at der står ref her:
ref class CliClass

Det forklarer en del, for så vil CliClass altid være et CLI objekt og CppClass vil aldrig være CLI(?) Men hvorfor skal man så bruge gcnew?

Kan man lave en pointer/reference til en int i CliClass fra CppClass? og/eller omvendt?

Jeg kikkede på noget assembler til en TI DSP forleden, det er ikke for børn.

Min hjemmeside repræsenterer min samlede viden om PHP, det er kun menuerne der bliver lavet i PHP, resten er ren html/CSS.



Ang. hvorfor gcnew skal være der, så tror jeg, det er fordi man godt kan lave en CLI-klasse uden at skrive 'ref'. Man kan bla. også skrive 'value', altså 'value class CliClass {'. Jeg ved, at i C# bliver strukturer gemt direkte på stakken, og klasser bliver gemt i heap'en (ved ikke lige hvad jeg skal kalde den på dansk; heap betyder vel også stak... eller bunke?), og en reference til klassen bliver gemt på stakken, så jeg tror, en ref class er det samme som en C# class, og en value class er det samme som en C# struct, og at det er derfor, gcnew skal bruges, da C# også tilbyder garbace-collection.

Jeg prøvede lige det du skrev om at lave en pointer eller reference, som pegede på CliClass::value. Det gik ikke:

Fold kodeboks ind/udKode 


Jeg ved ikke hvad en TI DSP er, men jeg synes også Assembler er avanceret. Det er næppe heller ikke det, jeg laver mit næste store GUI-program i. Men det er faktisk ikke så slemt at kode Win32 i masm32. For eksempel opretter dette lille program en funktion, der kalder MessageBox:

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 19.07.2009 21:55 af Bruger #8985
t