2013-02-27 61 views
11

tôi đã được đưa ra để thực hiện các chức năng:không có chức năng phù hợp cho cuộc gọi đến ''

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

mà trả lại khoảng cách giữa hai số phức. Định nghĩa của hàm nó nằm bên trong lớp Complex và tôi đã thực hiện nó như thế:

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

Theo như tôi biết một hàm tĩnh chỉ có thể truy cập vào các thành viên tĩnh và lớp học của tôi chỉ có

double _re; 
double _im; 

là thành viên dữ liệu.

Bên trong hàm main Tôi đã gọi nó như:

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

và lỗi tôi nhận được là:

lỗi: không có chức năng phù hợp cho cuộc gọi đến 'Complex :: distanta (Complex * &, Phức tạp * &) '

Bạn vui lòng cho tôi biết tôi đang làm gì sai? Cảm ơn!

+0

Phương thức tĩnh là phương pháp tĩnh? –

+1

Bạn có thể đăng [SSCCE] (http://sscce.org) để chúng tôi có thể tái tạo vấn đề không? –

+0

Bạn đang truyền hai cá thể đối tượng đến phương thức tĩnh, do đó, nó sẽ không có vấn đề gì về các thành viên của cá thể đó, nếu chúng được trưng ra. – crush

Trả lời

17

Bạn đang chuyển các con trỏ (Complex*) khi hàm của bạn tham chiếu (const Complex&). Một tham chiếu và một con trỏ là những thứ hoàn toàn khác nhau. Khi một hàm mong đợi đối số tham chiếu, bạn cần truyền trực tiếp đối tượng đó. Tham chiếu chỉ có nghĩa là đối tượng không được sao chép.

Để có được một đối tượng để vượt qua chức năng của bạn, bạn sẽ cần phải dereference con trỏ của bạn:

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

Hoặc có được chức năng của bạn để một vài tham số con trỏ.

Tuy nhiên, tôi sẽ không thực sự đề xuất một trong các giải pháp trên. Vì bạn không cần phải phân bổ động ở đây (và bạn đang bị rò rỉ bộ nhớ bởi vì bạn không delete những gì bạn có new ed), bạn nên không sử dụng con trỏ ở nơi đầu tiên:

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

Ồ tôi hiểu rồi. Dường như nó hoạt động. Cảm ơn nhiều! – Teodora

+2

@Teodora cho tôi đoán, Java hoặc C# kinh nghiệm? 'mới' chỉ cần thiết cho dữ liệu thời gian sống động trong C++, và nên được sử dụng thận trọng. Oh, và nếu câu trả lời của sfrabbit giải quyết được vấn đề của bạn, hãy đánh dấu vào câu trả lời. – Yakk

+0

Nó nói rằng tôi được phép chấp nhận trả lời trong 2 phút. – Teodora

3

Bạn đang cố gắng để vượt qua con trỏ (mà bạn không xóa, do đó rò rỉ bộ nhớ), nơi tài liệu tham khảo là cần thiết. Bạn không thực sự cần con trỏ ở đây:

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

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

// ... 

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

^Không có lý do gì để tạo firstComplexNumber và secondComplexNumber trên heap. Nếu bạn tạo chúng trên heap, bạn nên nhớ xóa chúng khi bạn làm xong. – crush

+0

@crush: Tôi nghĩ tôi đã chỉ ra điều đó. Hay tôi đang thiếu một cái gì đó? –

+0

Đó là lý do tại sao tôi bắt đầu bằng cách nói 'This^'. Nhận xét của tôi là một chú thích, không phải là một phê bình. – crush

Các vấn đề liên quan