2009-06-11 81 views
26

Tôi đã viết một phương thức (hoạt động tốt) cho a() trong một lớp học. Tôi muốn viết một phương pháp khác trong lớp đó mà các cuộc gọi phương pháp đầu tiên vậy:Gọi phương thức từ phương thức khác trong cùng một lớp trong C++

void A::a() { 
    do_stuff; 
} 

void A::b() { 
    a(); 
    do_stuff; 
} 

Tôi cho rằng tôi chỉ có thể viết lại b() nên b(A obj) nhưng tôi không muốn. Trong java bạn có thể làm một cái gì đó như this.a().

Tôi muốn làm obj.b() trong đó obj.a() sẽ được gọi là kết quả của obj.b().

+2

Bạn có thể làm rõ những gì bạn muốn không? –

+0

oh! Tôi đã có một lỗi khác gây ra điều này - mà tôi vừa sửa. – devin

+2

đảm bảo rằng a được xác định trước b, nếu b đang gọi –

Trả lời

4

Dường như mã bạn đã viết trong khối của mình sẽ hoạt động tốt. Chỉ cần chắc chắn rằng bạn có cả hai phương thức a() và b() được định nghĩa bên trong lớp của bạn đúng cách.

2

Những gì bạn đã viết ở đó sẽ hoạt động tốt. Trong C++ nếu bạn gọi a trong phạm vi b và cả hai là các phương pháp ví dụ của một số lớp học A, thì bạn không cần phải đủ điều kiện. Cả hai ab đều nằm trong phạm vi của nhau.

29

Những gì bạn phải làm việc tốt. Bạn có thể sử dụng "này" nếu bạn muốn:

void A::b() { 
    this->a(); 
    do_stuff; 
} 

hoặc

void A::b() { 
    this->A::a(); 
    do_stuff; 
} 

hoặc

void A::b() { 
    A::a(); 
    do_stuff; 
} 

nhưng những gì bạn có nên cũng làm việc:

void A::b() { 
    a(); 
    do_stuff; 
} 
+1

Tôi gặp lỗi: 'sử dụng không hợp lệ' này 'trong chức năng không phải thành viên' –

+0

là cách tốt hơn để sử dụng 'this' khi tham chiếu các phương thức/thuộc tính của lớp? – gen

2

Có một trường hợp mà bạn có thể có kết quả hơi bất ngờ . Đó là nếu A::a() là ảo, obj thực sự có loại DerivedFromA và DerivedFromA :: ghi đè A::a. Trong trường hợp đó, cuộc gọi đơn giản a(); hoặc chi tiết hơn this->a(); sẽ không gọi A :: a nhưng DerivedFromA :: a().

Bây giờ, điều này có thể được dự định, vì lớp A tuyên bố a() là ảo. Nhưng nếu bạn thực sự không có ý đó, bạn có thể bỏ qua ảo bằng cách viết cuộc gọi bằng cách

void A::b() 
{ 
    A::a(); // or 
    this->A::a(); //Both ignore the virtual-ness of a() 
}  
Các vấn đề liên quan