Jump to content
Sign in to follow this  
americopereira

Iniciação c++

Recommended Posts

americopereira

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
americopereira

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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
americopereira

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?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • 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.