2013-02-27 18 views
11

mi è stata data per implementare la funzione:alcuna funzione corrispondente per chiamata ''

"static double distanta (const Complex&, const Complex&);" 

che restituiscono la distanza tra due numeri complessi. La definizione della funzione si trova all'interno del complesso di classe e mi hanno messo in atto in quel modo:

double Complex::distanta(const Complex &a, const Complex &b) 
{  
    double x = a.real() - b.real(); 
    double y = a.imag() - b.imag(); 

    return sqrt(x * x + y * y); 
} 

Per quanto ne so una funzione statica può accedere solo i membri statici e la mia classe ha solo

double _re; 
double _im; 

come membri dei dati.

All'interno della funzione principale che ho definito come:

#include <iostream> 
#include "complex.h" 

using namespace std; 

int main() 
{ 
    Complex* firstComplexNumber; 
    firstComplexNumber = new Complex(81, 93); 

    cout << "Numarul complex este: " << *firstComplexNumber << endl; 

    Complex* secondComplexNumber; 
    secondComplexNumber = new Complex(31, 19); 

    cout << "Distanta dintre cele doua numere" <<endl << endl; 
    Complex::distanta(firstComplexNumber, secondComplexNumber); 
    return 0; 
} 

e l'errore che ottengo è:

errore: nessuna funzione di corrispondenza per la chiamata a 'Complex :: distanta (Complex * &, Complesso * &) '

Potrebbe dirmi per favore cosa sto facendo? Grazie!

+0

'Complex :: distanta' è un metodo statico? –

+1

Puoi pubblicare un [SSCCE] (http://sscce.org) in modo da poter riprodurre il problema? –

+0

Si stanno passando due istanze di oggetti al metodo statico, quindi non dovrebbe avere alcun problema ad agire su quei membri di istanze, se sono esposti. – crush

risposta

17

Si stanno passando dei puntatori (Complex*) quando la funzione prende i riferimenti (const Complex&). Un riferimento e un puntatore sono cose completamente diverse. Quando una funzione si aspetta un argomento di riferimento, è necessario passarlo direttamente all'oggetto. Il riferimento indica solo che l'oggetto non è stato copiato.

per ottenere un oggetto per passare alla funzione, si avrebbe bisogno di dereference i puntatori:

Complex::distanta(*firstComplexNumber, *secondComplexNumber); 

O ottenere la funzione di prendere argomenti puntatore.

Tuttavia, non suggerirei nessuna delle soluzioni precedenti. Dal momento che non è necessario l'allocazione dinamica qui (e si sono perdite di memoria, perché non si delete quello che hai new ndr), sei meglio non utilizzare i puntatori, in primo luogo:

Complex firstComplexNumber(81, 93); 
Complex secondComplexNumber(31, 19); 
Complex::distanta(firstComplexNumber, secondComplexNumber); 
+0

Oh capisco. Sembra funzionare ora. Grazie mille! – Teodora

+2

@Teodora fammi indovinare, esperienza Java o C#? 'new' è necessario solo per i dati di durata dinamica in C++ e deve essere usato con cautela. Oh, e se la risposta di sfrabbit ha risolto il tuo problema, dai un segno di spunta alla risposta. – Yakk

+0

Dice che mi è permesso accettare in risposta in 2 minuti. – Teodora

3

Sei cercando di passare i puntatori (che non si elimina , non si elimina lo, quindi si perde memoria) dove sono necessari riferimenti. Non hai davvero bisogno di indicazioni qui:

Complex firstComplexNumber(81, 93); 
Complex secondComplexNumber(31, 19); 

cout << "Numarul complex este: " << firstComplexNumber << endl; 
//         ^^^^^^^^^^^^^^^^^^ No need to dereference now 

// ... 

Complex::distanta(firstComplexNumber, secondComplexNumber); 
+0

This^Non vi è alcun motivo per creare firstComplexNumber e secondComplexNumber nell'heap. Se li crei nell'heap, ricordati di eliminarli quando hai finito. – crush

+0

@crush: Penso di averlo fatto notare. O mi sta sfuggendo qualcosa? –

+0

Ecco perché ho iniziato dicendo 'This ^'. Il mio commento è un'annotazione, non una critica. – crush

Problemi correlati