PDA

View Full Version : [Java - C++] qualche consiglio con un esempio


nico88desmo
05-07-2007, 21:42
Un saluto a tutti!

Ho da poco ripreso a programmare ad oggetti.
Come linguaggio di programmazione ho utilizzato sempre il java, però mi affascina, in quanto più comune e quindi più utilizzato, il C++.

Per iniziare avevo pensato di basarmi su un progetto java e riga per riga convertirlo in C++.
La prima difficoltà incontrata è l'allocazione di un nuovo oggetto all'interno di una classe.

Per esempio..


import java.io.*;
import java.awt.*;

class ProgConv {

public static void main (String args[]) {

ConvForm p = new ConvForm();

p.setVisible(true);
p.setResizable(true);
p.setSize(400,400);

}
}



Dato questo codice in java, l'allocazione di un nuovo oggetto come si fa in C++?

mapomapo
06-07-2007, 00:27
l'allocazione dinamica in c++ funziona con l'operatore new....la deallocazione con l'operatore delete....la cosa dovrebbe essere molto simile....

esempio:

int *v;

v = new int;

v = 2;

delete v;


Vito

71104
06-07-2007, 01:18
Come linguaggio di programmazione ho utilizzato sempre il java, però mi affascina, in quanto più comune e quindi più utilizzato, il C++. sia Java che C++ sono molto diffusi, ma potendo scegliere direi che è masochistico scegliere C++: Java è più facile e quindi più produttivo, ed è veramente molto difficile che tu abbia un irrinunciabile bisogno delle features che il C++ ha e Java no.

Dato questo codice in java, l'allocazione di un nuovo oggetto come si fa in C++? è identica: si usa l'operatore new, solo che a differenza di Java in C++ devi anche sbatterti coi puntatori: la variabile che tiene il... "riferimento all'oggetto", deve essere dichiarata come puntatore alla classe, e per dichiarare un puntatore devi precedere il nome della variabile con un asterisco. dopodiché non è finita: il C++ non ha il garbage collector, quindi la memoria allocata con new te la devi liberare a mano, e se te ne scordi è un problema. esempio:


class Lol {
.
.
.
};

.
.
.

Lol *asd = new Lol();

// uso l'oggetto
// ...

delete asd;


i pochi cambiamenti che il passaggio a C++ introduce da Java sono tutti molto poco intuitivi. è raro trovare un senso a tale passaggio.

71104
06-07-2007, 01:21
l'allocazione dinamica in c++ funziona con l'operatore new....la deallocazione con l'operatore delete....la cosa dovrebbe essere molto simile.... con quell'esempio (tra l'altro errato) non lo aiuti: in Java non è possibile allocare dinamicamente un solo int, semmai un vettore costituito da un solo int. ed inoltre Java ha un comodissimo garbage collector, percui niente delete :p

nico88desmo
06-07-2007, 09:42
Ringrazio per le risposte tempestive :D

sia Java che C++ sono molto diffusi, ma potendo scegliere direi che è masochistico scegliere C++: Java è più facile e quindi più produttivo, ed è veramente molto difficile che tu abbia un irrinunciabile bisogno delle features che il C++ ha e Java no.

Questo lo so, infatti è anche per questo che a scuola abbiamo imparato il java. Però, siccome tutti parlano di questo C++, allora vorrei trarne delle conclusioni io a riguardo di questo linguaggio, e per questo motivo ho deciso di impararlo.

Ho provato con questo codice

#pragma once

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
//#include "h1.h"

namespace prova_1 {

public ref class Form2 : public System::Windows::Forms::Form {

h1 *p = new h1();

public:


Form2(void) {
InitializeComponent();

//
//TODO: aggiungere qui il codice del costruttore.
//
}


però mi dà errore nell'allocazione di p

mapomapo
06-07-2007, 11:40
con quell'esempio (tra l'altro errato) non lo aiuti: in Java non è possibile allocare dinamicamente un solo int, semmai un vettore costituito da un solo int. ed inoltre Java ha un comodissimo garbage collector, percui niente delete :p

ho detto dovrebbe perchè non so un'h di java :)

comunque sia non penso sia un errore allocare dinamicamente un intero in quella maniera....non serve a niente farlo...era giusto per far vedere i due operatori...

71104
06-07-2007, 13:46
Ho provato con questo codice

#pragma once

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
//#include "h1.h"

namespace prova_1 {

public ref class Form2 : public System::Windows::Forms::Form {

h1 *p = new h1();

public:


Form2(void) {
InitializeComponent();

//
//TODO: aggiungere qui il codice del costruttore.
//
}


però mi dà errore nell'allocazione di p uhm, stai usando C++ Managed, non C++ nudo e crudo... purtroppo sintatticamente parlando non so aiutarti, ma rifacendomi al C++ standard posso dirti che (a differenza di Java) non è possibile inizializzare una variabile membro alla sua dichiarazione nella classe: la devi inizializzare per forza da codice. dal momento che usi C++ Managed non so se ti conviene usare new, piuttosto dovresti documentarti sull'operatore gcnew che supporta il garbage collector (se usi gcnew non hai bisogno di fare delete).

71104
06-07-2007, 13:47
comunque sia non penso sia un errore allocare dinamicamente un intero in quella maniera.... in Java si, in C++ no, ma l'errore nell'esempio C++ era un altro: hai assegnato un int ad un int*

v = 2;


avresti dovuto scrivere invece:

*v = 2;

nico88desmo
06-07-2007, 14:16
uhm, stai usando C++ Managed, non C++ nudo e crudo... purtroppo sintatticamente parlando non so aiutarti, ma rifacendomi al C++ standard posso dirti che (a differenza di Java) non è possibile inizializzare una variabile membro alla sua dichiarazione nella classe: la devi inizializzare per forza da codice. dal momento che usi C++ Managed non so se ti conviene usare new, piuttosto dovresti documentarti sull'operatore gcnew che supporta il garbage collector (se usi gcnew non hai bisogno di fare delete).

Che differenza c'è???

nico88desmo
07-07-2007, 18:28
up

71104
07-07-2007, 18:41
la differenza è che il C++ Managed assomiglia di più a una piattaforma managed, per l'appunto; tanto per cominciare ha un garbage collector, e poi non so di preciso quali altre differenze ci siano; forse il fatto che un programma scritto in Visual C++ in C++ Managed produce bytecode anziché un eseguibile nativo.

comunque sia quando in giro senti parlare di C++ di certo non si sta parlando di C++ Managed: quando se ne parla viene specificato esplicitamente.

mapomapo
07-07-2007, 18:44
in Java si, in C++ no, ma l'errore nell'esempio C++ era un altro: hai assegnato un int ad un int*

v = 2;


avresti dovuto scrivere invece:

*v = 2;


devo smetterla di dare consigli quando torno a casa la sera :D:D
inutile dirti che leggevo *v in "automatico".....che nab....

vabbè :D

nico88desmo
09-07-2007, 10:17
la differenza è che il C++ Managed assomiglia di più a una piattaforma managed, per l'appunto; tanto per cominciare ha un garbage collector, e poi non so di preciso quali altre differenze ci siano; forse il fatto che un programma scritto in Visual C++ in C++ Managed produce bytecode anziché un eseguibile nativo.

comunque sia quando in giro senti parlare di C++ di certo non si sta parlando di C++ Managed: quando se ne parla viene specificato esplicitamente.

Capito. :)