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:
#include <iostream>
using namespace System;
using std::cout;
using std::cin;
using std::endl;
ref class CliClass
{
public:
int i;
CliClass(void) : i(0) {}
};
class CppClass
{
public:
CliClass ^cli; // error C3265: cannot declare a managed 'cli' in an unmanaged 'CppClass'
int *p; // Dette bliver pointeren til CliClass::i
int &r; // Dette bliver referencen til CliClass::i
CppClass(void) : r(&cli->i) // error C2440: 'initializing' : cannot convert from 'cli::interior_ptr<Type>' to 'int &'
{ // error C2439: 'CppClass::r' : member could not be initialized
cli = gcnew CliClass();
p = &cli->i; // error C2440: '=' : cannot convert from 'cli::interior_ptr<Type>' to 'int *'
r = cli->i;
}
};
void main(void)
{
CliClass ^cli = gcnew CliClass();
// Ingen af disse virker:
int &r = cli->i; // error C2440: 'initializing' : cannot convert from 'int' to 'int &'
int *p = &(cli->i); // error C2440: 'initializing' : cannot convert from 'cli::interior_ptr<Type>' to 'int *'
cin.get();
}
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:
.386
.model flat, stdcall
option casemap:none ; Forskel på store og små bogstaver
include \masm32\include\windows.inc ; #include <windows.inc>
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib ; Sikkert noget med #pragma comment(linker, "user32.lib"), jeg er ikke så god til preprocessorer
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
mbText db "MessageBox-tekst", 0 ; const char *mbText = "MessageBox-Text". db står for "Define byte". Jeg ved ikke hvad 0'et gør endnu
; Jeg ved, de skal initialiseres med det samme, men jeg ved ikke om de er konstante
mbCapt db "Overskrift", 0 ; capt = caption og er bare variablens/konstantens navn
.code
informUser proc ; void informUser(void) {
invoke MessageBox, NULL, addr mbText, addr mbCapt, MB_ICONINFORMATION
ret ; return
informUser endp ; }
start: ; int main(void) {
call informUser
invoke ExitProcess, 0 ; return 0;
end start ; }
Indlæg senest redigeret d. 19.07.2009 21:55 af Bruger #8985