Geen overeenkomende functie voor bellen naar ”

Ik kreeg het om de functie te implementeren:

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

die de afstand tussen twee complexe getallen retourneren. De definitie van de functie die het is in de complexe klasse en ik heb het zo geïmplementeerd:

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

Voor zover ik weet kan een statische functie alleen toegang krijgen tot statische leden en mijn klasse heeft alleen

double _re;
double _im;

als gegevensleden.

Binnen de hoofdfunctie heb ik het gebeld als:

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

en de fout die ik krijg is:

FOUT: Geen overeenkomende functie voor oproep tot ‘Complex :: Distanta (complex * & amp; complex * & amp;)’

Kunt u me alsjeblieft vertellen wat is het dat ik verkeerd doe?
Bedankt!


Antwoord 1, Autoriteit 100%

U passeert aanwijzingen (Complex*) Wanneer uw functie referenties (const Complex&). Een referentie en een aanwijzer zijn geheel verschillende dingen. Wanneer een functie een referentieargument verwacht, moet u het het object direct doorgeven. De referentie betekent alleen dat het object niet wordt gekopieerd.

Om een ​​object te krijgen om door te geven aan uw functie, zou u uw aanwijzingen moeten dalen:

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

of ontvang uw functie om aanwijzerargumenten te nemen.

Ik zou echter niet echt een van de bovenstaande oplossingen voorstellen. Omdat je hier geen dynamische toewijzing nodig hebt (en je lekt geheugen omdat je niet deletewat je hebt newED), ben je beter af met het gebruik van aanwijzingen In de eerste plaats:

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

Antwoord 2, Autoriteit 15%

U probeert de pointers te passeren (die u niet verwijderen , aldus lekkende geheugen) waar referenties nodig zijn. Je hebt hier niet echt aanwijzingen nodig:

Complex firstComplexNumber(81, 93);
Complex secondComplexNumber(31, 19);
cout << "Numarul complex este: " << firstComplexNumber << endl;
//                                  ^^^^^^^^^^^^^^^^^^ No need to dereference now
// ...
Complex::distanta(firstComplexNumber, secondComplexNumber);

Other episodes