Jump to content

Iniciação c++


americopereira

Recommended Posts

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 by thoga31
GeSHi
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.