PDA

View Full Version : [c++] funzione operator = non disponibile in system::collections::generic::list<T>


EmaGuzzetti
02-08-2009, 15:49
salve a tutti...premetto che io sono un programmatore di vb.net e c# e sto provando a passare al c++... sto usando però sempre le winforms e il .net framework 2.0 tramite visual studio 2008...
il mio problema è questo... devo creare una classe Applicazione che contiene 3 variabili... il tipo, il nome e una lista di stringhe...visto che al momento non ho trovato classi facili come le list (of ) di visual basic e comunque mi ero sempre trovato bene ho deciso di usarle anche qui..
questa è la classe che ho creato:
Applicazione.h

#pragma once
using namespace System;
using namespace System::Collections::Generic;
ref class Applicazione
{
public:
Applicazione(String ^, List<String^>, String^);
Applicazione(String ^, String^, String^);
Applicazione(String ^, String^);
Applicazione(String ^);
String^ getNome();
void setNome(String^);
String^ getTipo();
void setTipo(String^);
List<String^> getPaths();
void setPaths(List<String^> );
String^ getPath();
virtual ~Applicazione(void);
protected:
String^ NomeA;
List<String^> PathsA;
String^ TipoA;
};


Applicazione.cpp

#include "StdAfx.h"
#include "Applicazione.h"
using namespace System;
using namespace System::Collections::Generic;
Applicazione::Applicazione(String^ Nome, List<String^> Paths, String^ Tipo)
{
NomeA=Nome;
TipoA=Tipo;
PathsA=
Paths;
}

Applicazione::Applicazione (String^ Nome, String^ Path, String^ Tipo)
{
NomeA=Nome;
TipoA=Tipo;
PathsA= gcnew List<String^>;
PathsA.Add(Path);
}

Applicazione::Applicazione (String^ Nome, String^ Tipo)
{
NomeA=Nome;
TipoA=Tipo;
}

Applicazione::Applicazione (String^ Tipo)
{
TipoA=Tipo;
}

Applicazione::~Applicazione(void)
{
}

String^ Applicazione::getNome(){
return NomeA;
}
void Applicazione::setNome(String^ Nome){
NomeA=Nome;
}

List<String^> Applicazione::getPaths(){

return PathsA;
}
void Applicazione::setPaths(List<String^> Paths){
PathsA=Paths;
}

String^ Applicazione::getTipo(){
return TipoA;
}
void Applicazione::setTipo(String^ Tipo){
TipoA=Tipo;
}

String^ Applicazione::getPath(){
return PathsA[0];
}


solo che quando tento di assegnare a PathsA la variabile di tipo list(of) mi da il seguente errore:
error C2582: funzione 'operator =' non disponibile in 'System::Collections::Generic::List<T>'

e quando tento il return della classe mi da il seguente errore:
error C3073: 'System::Collections::Generic::List<T>': la classe di riferimento non ha un costruttore di copia definito dall'utente

come posso risolvere usando sempre la classe list(OF)? so che il c++ non elimina direttamente i dati ma bisogna rimuoverli tramite distruttore..ma non so come si implementa..potreste farmi un esempio? e infine, non c'è una classe del c++ simile e potente come le list(of) del .net framework? e come posso assegnare un valore nullo alle classi del .net framework?!?

EmaGuzzetti
07-08-2009, 00:00
nessuno sa aiutarmi?

tomminno
07-08-2009, 00:04
Per prima cosa quello non è C++ ma C++/CLI, ovvero qualcosa che ha nel nome la scritta C++ ma che non lo è.

Comunque il tuo problema è che mancano le parentesi tonde:
[code]
PathsA= gcnew List<String^>();
[code]

EmaGuzzetti
07-08-2009, 09:43
Per prima cosa quello non è C++ ma C++/CLI, ovvero qualcosa che ha nel nome la scritta C++ ma che non lo è.

Comunque il tuo problema è che mancano le parentesi tonde:
[code]
PathsA= gcnew List<String^>();
[code]

no il problema me lo da piu volte e all'altezza di:
PathsA=Paths;
credo sia dovuto che il c++ per il return crea una copia della variabile..e non avendo un costruttore di copia non sa come fare...solo che non so come farne una copia!

tomminno
08-08-2009, 09:22
no il problema me lo da piu volte e all'altezza di:
PathsA=Paths;
credo sia dovuto che il c++ per il return crea una copia della variabile..e non avendo un costruttore di copia non sa come fare...solo che non so come farne una copia!

In C++/CLI ogni tipo riferimento deve essere seguito da ^.
A te manca tutte le volte che scrivi List<String^>, devi specificare che stai usando un riferimento e quindi List<String^>^.

Inoltre i tipi riferimento usano l'operatore di selezione dei puntatori del vero C++ quindi non puoi scrivere PathA.Add(Path) ma PathA->Add(Path)

Infine ti prego di non continuare a chiamare quell'affare C++ perchè non lo è.

EmaGuzzetti
08-08-2009, 10:34
grazie mille! sai anche come controllare che non sia null il valore dell'oggetto? naturalmente l'= a 0 non funziona per un oggetto del framework..e cmq scusa per averlo chiamato sempre c++ ma non sapevo che microsoft vs ha tentato di standardizzare il c++ a suo modo.. comunque oramai sto provando a non usare winforms...ma mi blocco qui:
http://www.hwupgrade.it/forum/showthread.php?p=28470205#post28470205
puoi aiutarmi?