18

私は関数を実装するために与えられました:

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

2 つの複素数の間の距離を返します。関数の定義は 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(Complex*&, Complex*&)' の呼び出しに一致する関数がありません

私が間違っていることを教えてください。ありがとう!

4

2 に答える 2

26

Complex*関数が参照 ( ) を受け取るときに、ポインター ( ) を渡していますconst Complex&。参照とポインタはまったく別のものです。関数が参照引数を期待する場合、オブジェクトに直接渡す必要があります。参照は、オブジェクトがコピーされていないことを意味するだけです。

関数に渡すオブジェクトを取得するには、ポインターを逆参照する必要があります。

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

または、関数にポインター引数を取るようにします。

ただし、上記の解決策のいずれも実際にはお勧めしません。ここでは動的割り当ては必要ないため (そして、delete何をnew編集したかがわからないためメモリ リークが発生している)、最初からポインターを使用しない方がよいでしょう。

Complex firstComplexNumber(81, 93);
Complex secondComplexNumber(31, 19);
Complex::distanta(firstComplexNumber, secondComplexNumber);
于 2013-02-27T14:02:45.573 に答える
4

参照が必要な場所にポインターを渡そうとしています (削除しないため、メモリリークが発生します)。ここではポインターは必要ありません。

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

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

// ...

Complex::distanta(firstComplexNumber, secondComplexNumber);
于 2013-02-27T14:03:29.063 に答える