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