Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

americopereira

Iniciação c++

Mensagens Recomendadas

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;
}

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.