2013-02-27 2 views
11

я был дан для реализации функции:нет функции согласования для вызова «»

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

, возвращающие расстояние между двумя комплексными числами. Определение функции он находится внутри комплекса класса и я реализовал это так:

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

Насколько я знаю, статическая функция может получить доступ только статические члены и мой класс имеет только

double _re; 
double _im; 

в качестве данных.

В основной функции я назвал его как:

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

и ошибка, я получаю:

ошибка: нет соответствия функции для вызова «Complex :: distanta (комплекс * &, Комплекс * &) '

Не могли бы вы рассказать мне, что я делаю неправильно? Спасибо!

+0

Является ли «Комплекс :: distanta» статическим методом? –

+1

Можете ли вы опубликовать [SSCCE] (http://sscce.org), чтобы мы могли воспроизвести проблему? –

+0

Вы передаете два экземпляра объекта статическому методу, поэтому для них не должно быть никаких проблем, если они открыты. – crush

ответ

17

Вы передаете указатели (Complex*), когда ваша функция принимает ссылки (const Complex&). Ссылка и указатель - совершенно разные вещи. Когда функция ожидает опорный аргумент, вам необходимо передать объект непосредственно. Ссылка означает, что объект не копируется.

Чтобы получить объект, чтобы пройти к вашей функции, вам нужно будет разыменовать ваши указатели:

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

Или получить функцию, чтобы принимать аргументы указателя.

Однако я бы не предложил ни одно из вышеуказанных решений. Так как вам не нужно динамическое распределение здесь (и вы утечка памяти, потому что вы не delete то, что у вас есть new-й изд), вы лучше не использовать указатели в первую очередь:

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

О, я вижу. Кажется, теперь это работает. Большое спасибо! – Teodora

+2

@Teodora позвольте мне угадать, Java или C# опыт? 'new' необходим только для динамических данных о времени жизни на C++ и должен использоваться с осторожностью. О, и если ответ sfrabbit решит вашу проблему, поставьте галочку на ответ. – Yakk

+0

В нем говорится, что я могу принять ответ в течение 2 минут. – Teodora

3

Вы пытаясь передать указатели (которые вы не удаляете, тем самым теряя память), где нужны ссылки. Вам здесь не нужны указатели:

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

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

// ... 

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

Это^Нет причин создавать firstComplexNumber и secondComplexNumber в куче. Если вы создадите их в куче, лучше помните, что удаляйте их, когда закончите. – crush

+0

@crush: Я думаю, что я это указал. Или я чего-то не хватает? –

+0

Вот почему я начал с слов «Это». Мой комментарий - аннотация, а не критика. – crush

Смежные вопросы