Ir para conteúdo
Fórum Script Brasil
  • 0

Erro no uso de função amiga


Castro

Pergunta

:(

#include <iostream>
using namespace std;

class Multiplica_amiga
{
      friend int Multiplicar(Multiplica_amiga,int &var1, int&var2);
      private:
              int valorA,valorB;
      public:
             Multiplica_amiga():valorA(2),valorB(5) 
             {
             }
             
             void Mostra_produto();
};

int main()
{
  return(0);
}

int Multiplicar(Multiplica_amiga, int &var1, int &var2)
{
    int produto;
    
    produto = var1.valorA * var2.valorB;
return (produto);
}

Erros:

D:\FonteLivroC++\Função_amiga.cpp In function `int Multiplicar(Multiplica_amiga, int&, int&)':

26 D:\FonteLivroC++\Função_amiga.cpp `valorA' has not been declared

26 D:\FonteLivroC++\Função_amiga.cpp request for member of non-aggregate type before '*' token

Observe, que ainda existe reclamação quanto ao uso da referência, e a função não enxerga o as variáveis inicializadas pelo construtor.

Onde erro ?

Obrigado

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

int Multiplicar(Multiplica_amiga, int &var1, int &var2)
Pelo que entendi, var1 e var2 deveriam ser objetos da classe Multiplica_amiga. Nesse caso, ao invés de declará-los como int& o correto seria o seguinte:
int Multiplicar(Multiplica_amiga& objeto_a, Multiplica_amiga& objeto_b)
{
    int produto;
    produto = objeto_a.valorA * objeto_b.valorB;
    return (produto);
}
E depois utilizar a função assim:
Multiplicar(objeto_a, objeto_b)
Caso var1 e var2 estejam se referindo ao valor dos atributos da classe Multiplica_amiga, não é necessário passá-los para a função como um parâmetro. Basta passar um objeto e a função se encarrega de obter os valores.
int Multiplicar(Multiplica_amiga& objeto)
{
    int produto;
    produto = objeto.valorA * objeto.valorB;
    return (produto);
}
E depois basta chamar a função desse jeito:
Multiplicar(objeto)

Link para o comentário
Compartilhar em outros sites

  • 0

:(

Quando fui chamar a função no programa principal, seguindo seu modelo, o ocorreu erro, pois a função não reconheceu as variáveis valorA e ValorB.

#include <iostream>
using namespace std;

class Multiplica_amiga
{
      friend int Multiplicar(Multiplica_amiga& var1,
       Multiplica_amiga& var2);
      private:
              int valorA,valorB;
      public:
             Multiplica_amiga():valorA(2),valorB(5) 
             {
             }
             
};

int main()
{
    [b]Multiplicar(valorA,valorB);[/b]
  return(0);
}

int Multiplicar(Multiplica_amiga& var1,Multiplica_amiga& var2)
{
    int produto;
    
    produto = var1.valorA * var2.valorB;
return (produto);
}

Ao inicializar valorA e valorB no construtor, imaginei que estas tivessem visibilidade na chamada da função, no programa principal. Onde ainda estou errando ?

Erros:

D:\FonteLivroC++\Função_amiga.cpp In function `int main()'

19 D:\FonteLivroC++\Função_amiga.cpp `valorA' undeclared (first use this function)

(Each undeclared identifier is reported only once for each function it appears in.)

19 D:\FonteLivroC++\Função_amiga.cpp `valorB' undeclared (first use this function)

Obrigado

Ps: a confirmação de menagem não está chemando na minha caixa de e-mail.

Editado por Castro
Link para o comentário
Compartilhar em outros sites

  • 0

O correto não é passar as variáveis valorA e valorB como parâmetro, você apenas deve passar o(s) objeto(s).

int Multiplicar(Multiplica_amiga& objeto)
{
    int produto;
    produto = objeto.valorA * objeto.valorB;
    return (produto);
}
...
int main()
{
...
Multiplica_amiga objeto; //objeto da classe "Multiplica_amiga"
Multiplicar(objeto); //chama a função passando o objeto como parâmetro
...
}

Caso fosse necessário passar mais de um objeto como parâmetro, funcionaria da mesma maneira.

Link para o comentário
Compartilhar em outros sites

  • 0

:wacko:

Quando disse para passar objeto, entendi que era para passar o nome da classe(no caso com membros usados) como argumento.

Tentei as seguintes Variações:

int main()
{
   //Multiplica_amiga Multiplicar;
   Multiplica_amiga var1, var2;
    Multiplicar(Multiplica_amiga);
  return(0);
}
Erro:
21 D:\FonteLivroC++\Função_amiga.cpp expected primary-expression before ')' token
Tentei:
int main()
{
    Multiplicar(Multiplica_amiga);
  return(0);
}
Erro
D:\FonteLivroC++\Função_amiga.cpp In function `int main()': 19 D:\FonteLivroC++\Função_amiga.cpp expected primary-expression before ')' token
Tentei
int main()
{
    Multiplicar(Multiplica_amiga&());
  return(0);
}
Erro:
D:\FonteLivroC++\Função_amiga.cpp In function `int main()': 19 D:\FonteLivroC++\Função_amiga.cpp expected primary-expression before '&' token 19 D:\FonteLivroC++\Função_amiga.cpp expected primary-expression before ')' token
Tentei
int main()
{
    Multiplicar(Multiplica_amiga());
  return(0);
}
Erro:
D:\FonteLivroC++\Função_amiga.cpp In function `int main()': 19 D:\FonteLivroC++\Função_amiga.cpp invalid initialization of non-const reference of type 'Multiplica_amiga&' from a temporary of type 'Multiplica_amiga' 7 D:\FonteLivroC++\Função_amiga.cpp in passing argument 1 of `int Multiplicar(Multiplica_amiga&, Multiplica_amiga&)'
Por fim tentei
int main()
{
    Multiplicar(Multiplica_amiga& var1,Multiplica_amiga& var2);
  return(0);
}
Logicamente mais erro. Se eu fizer:
int main()
{
    //Multiplicar(Multiplica_amiga);
  return(0);
}

travando a linha o programa compila.

Ainda enxerguei meu erro.

Editado por Castro
Link para o comentário
Compartilhar em outros sites

  • 0

Ao invés de passar o nome da classe como parâmetro, você deve passar o nome do objeto (isto é, o nome da variável).

int Multiplicar(Multiplica_amiga& objeto_a, Multiplica_amiga& objeto_b)
{
    int produto;
    produto = objeto_a.valorA * objeto_b.valorB;
    return (produto);
}

...
int main()
{
...
Multiplica_amiga var1, var2;
Multiplicar(var1, var2);
...
}

Link para o comentário
Compartilhar em outros sites

  • 0

:D

Deu certo !!!

Agora que deu certo, gostaria de tirar algumas dúvidas sobre a sintaxe:

friend int Multiplicar(Multiplica_amiga& var1,  Multiplica_amiga& var2);
int Multiplicar(Multiplica_amiga& var1,Multiplica_amiga& var2)
{
  .
  .
 return (produto)
}
Nas linhas acima, o nome da classe foi passado com símbolo de rereferência -&- por quê ?
int main()
{
   
   Multiplica_amiga var1, var2;
   Multiplicar(var1,var2);
  return(0);
}
por que não precisei indicar o tipo para var1 e var2 ? Por fim veja a classe e as funções
class Multiplica_amiga
{
      friend int Multiplicar(Multiplica_amiga& var1,
       Multiplica_amiga& var2);
       
      private:
              int valorA,valorB,recebe_produto;
      public:
             Multiplica_amiga():valorA(2),valorB(5) 
             {
               recebe_produto=produto;
             }
             void Mostra_produto();
     
};

int Multiplicar(Multiplica_amiga& var1,Multiplica_amiga& var2)
{
  int produto;  
 produto = var1.valorA * var2.valorB;
return (produto);
}

void Multiplica_amiga:: Mostra_produto()
{
     cout << recebe_produto << endl;
    
  return;
}

por que não consigo retornar a variável produto para a varíavel recebe_produto no construtor ? mesmo que eu deixe de declarar produto como local da função e declare como atributo de classe, ainda sim recemo mensagem dizendo que produto não foi declarado.

Obridado

Editado por Castro
Link para o comentário
Compartilhar em outros sites

  • 0
Nas linhas acima, o nome da classe foi passado com símbolo de rereferência -&- por quê ?
O objetivo é passar uma referência para o objeto, e não uma cópia do objeto (dessa forma o valor passado pode ser modificado e ainda há uma economia em termos de eficiência). Referências funcionam de forma parecida com ponteiros, mudando basicamente a sintaxe.

por que não precisei indicar o tipo para var1 e var2 ?

A função "sabe" pela sua declaração de que tipos serão os objetos (no caso, pertencerão à classe Multiplica_amiga). Dessa forma não é preciso especificar na sua chamada.

por que não consigo retornar a variável produto para a varíavel recebe_produto no construtor ? mesmo que eu deixe de declarar produto como local da função e declare como atributo de classe, ainda sim recemo mensagem dizendo que produto não foi declarado.

O construtor do objeto é chamado assim que ele é inicializado, isto é, antes da função Multiplicar ser chamada. Caso deseje alterar o valor da variável, deverá fazê-lo na própria função Multiplicar e não no construtor.

int Multiplicar(Multiplica_amiga& var1,Multiplica_amiga& var2)
{
produto = var1.valorA * var2.valorB;
var1.recebe_produto=produto; //seta o atributo "recebe_produto" do objeto "var1"
return (produto);
}

Link para o comentário
Compartilhar em outros sites

  • 0

:D

Ok. Resolvi o problema do retorno do valor da multiplicação. Assim sendo, gostaria de voltar ao tema. Considere as linhas:

var1 e var2 são parâmetros definidos em;

int Multiplicar(Multiplica_amiga& var1,Multiplica_amiga& var2)
então qual a lógica de var1 e var2 nas linhas abaixo ? não parece redundante ? é a primeira vez que vejo nome de parâmetro ser o mesmo de argumento.
Multiplica_amiga var1, var2;
Multiplicar(var1,var2);

Poderia ajudar no link abaixo ?

http://scriptbrasil.com.br/forum/index.php?showtopic=161426

livros como do Deitel e Hebert Schildt não são didáticos no tema do link

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

O nome da variável na declaração da função representa o nome que a função utilizará para se referir a ela (isto é, dentro do código da função Multiplica a variável será acessada por esse nome). Já o nome da variável na chamada da função representa o nome da variável que será passado como parâmetro (no caso, o nome da variável na função main).

Os nomes poderiam perfeitamente serem diferentes, como no exemplo:

int soma(int a, int b)
{
return a+b;
}
....
void outra_funcao()
{
int c=5;
int d=10;
int resultado=soma(c, d);
}

Quanto ao outro tópico, não estou com muito tempo agora, mas assim que possível darei uma olhada.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152.1k
    • Posts
      651.8k
×
×
  • Criar Novo...