americopereira Posted February 11, 2013 at 11:34 PM Report #494949 Posted February 11, 2013 at 11:34 PM (edited) Viva pessoal, agradecia uma ajuda, visto eu estar a transitar do c para c++. ao compilar o seguinte codigo tenho um erro de compilação na linha de codigo "p1.openfilefornecedor(con); " Error 1 error C3073: 'System::Data::SqlClient::SqlConnection' : ref class does not have a user-defined copy constructor Alguém me pode ajudar? Obrigado. #include "stdafx.h" #include <iostream> #include "StdAfx.h" #include <string> #using <System.dll> #using <system.data.dll> using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; class Person { private: int height; public: Person(); ~Person(); void openfilefornecedor(SqlConnection con); }; Person::Person(void) { } Person::~Person(void) { } void Person::openfilefornecedor(SqlConnection con) { con.ConnectionString = "Data Source=mekito-hp\\SQLEXPRESS;Initial Catalog=soberbo;Integrated Security=True"; con.Open (); // Open up the connection } int _tmain(int argc, _TCHAR* argv[]) { Person p1; SqlConnection con; p1.openfilefornecedor(con); return 0; } Edited February 11, 2013 at 11:36 PM by thoga31 GeSHi
HappyHippyHippo Posted February 12, 2013 at 12:33 AM Report #494953 Posted February 12, 2013 at 12:33 AM quando chamas a função: void Person::openfilefornecedor(SqlConnection con) não estás a passar nenhum ponteiro para a função. o que estás a fazer é criar uma cópia do objecto passado como argumento exemplo: class A { protected: int i; public: int get() const { return i; } void set(int i) { this->i = i; } // não tem construtor, destrutor ou construtor-cópia definido // o compilador fará isso por mim, porque consegue (atenção) !!! // se não conseguir criar o construtor-cópia, a classe fica sem essa funcionalidade !!! } int func(A a) { // <--- a variável "a" é uma cópia da classe passada como argumento a.set(10); } int main() { A a; a.set(1); // <--- a.i = 1 func(a); // <--- a.i = 1 (porque o que a função manipulou é uma cópia) cout << a.get() << endl; // output >> 1 } o erro que tu tens é exactamente esse, a classe que estás a enviar para a função não tem construtor-cópia. solução : envia um ponteiro para a classe que estás a passar. // ... void Person::openfilefornecedor(SqlConnection * con) { con->ConnectionString = "Data Source=mekito-hp\\SQLEXPRESS;Initial Catalog=soberbo;Integrated Security=True"; con->Open (); // Open up the connection } // ... int _tmain(int argc, _TCHAR* argv[]) { Person p1; SqlConnection con; p1.openfilefornecedor(&con); return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
americopereira Posted February 12, 2013 at 10:41 AM Author Report #494962 Posted February 12, 2013 at 10:41 AM Bom dia Happy, obrigado mais uma vez por me aturares, sim concordo plenamente com a tua solução, a qua,l eu quando fiz o código inicial era o que tinha, que é a mais lógica, no entanto quando declaro a função: void Person::openfilefornecedor(SqlConnection * con); dá-me um erro de compilação que eu não entendo e não acho lógico Error 1 error C3699: '*' : cannot use this indirection on type 'System::Data::SqlClient::SqlConnection' p1.openfilefornecedor(&con); Error 3 error C3072: operator '&' cannot be applied to an instance of a ref class estou a migrar para c++ e surgem duvidas de falta de experiência.
HappyHippyHippo Posted February 12, 2013 at 10:51 AM Report #494965 Posted February 12, 2013 at 10:51 AM estive a ver e para tratar esse assunto é um bocado mais complicado. deverás estar a trabalhar em managed c++ do visual studio. este tipo de código necessita de usar uma sintaxe ligeiramente diferente. requer que a memória seja toda gerida por um garbage collector, algo que a linguagem não tem por defeito. o código que deverias ter seria: // ... void Person::openfilefornecedor(SqlConnection^ con) { con->ConnectionString = "Data Source=mekito-hp\\SQLEXPRESS;Initial Catalog=soberbo;Integrated Security=True"; con->Open (); // Open up the connection } // ... int _tmain(int argc, _TCHAR* argv[]) { Person p1; SqlConnection^ con = gcnew SsqlConnection(); p1.openfilefornecedor(con); return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
americopereira Posted February 12, 2013 at 02:09 PM Author Report #494993 Posted February 12, 2013 at 02:09 PM Ok, obrigado, sim assim já funciona. Já agora sabes como desactiva managed c++, ou para se trabalhar com as namespace System::Data::SqlClient e com <system.data.dll> necessito de estar neste modo?
HappyHippyHippo Posted February 12, 2013 at 02:52 PM Report #494996 Posted February 12, 2013 at 02:52 PM estás a trabalhar com .Net, acho que terás de usar sempre o ambiente Managed IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now