2012-03-15 39 views
8

Có cách nào để gọi phương thức thành viên lớp không tĩnh từ phương thức khác được chứa trong lớp chính trong C++ không? Nếu có, mã sẽ trông như thế nào?Gọi phương thức thành viên không tĩnh từ phương thức khác

Vấn đề là, tôi không thể khai báo phương thức specfic này là tĩnh, vì nó sử dụng các phương thức khác trong cùng một lớp mà sau đó không hoạt động nếu tôi làm cho phương thức tĩnh.

Tôi đang cố gắng để sử dụng:

MyClass::myClassMethod(); 

từ một phương pháp trong lớp học chính, nhưng nó mang lại cho tôi những lỗi: một tổ chức phi tham khảo thành viên tĩnh phải liên quan đến một đối tượng cụ thể.

Để làm rõ, myClassMethod() sử dụng các phương pháp khác trong MyClass như:

void myClassMethod() { 
    ... 
    anotherClassMethod(); 
} 

vì vậy nếu tôi được làm myClassMethod tĩnh nó sẽ gây trở ngại cho gọi anotherClassMethod().

+0

Sau khi đọc câu hỏi và nhận xét trong các câu trả lời đã đăng, sẽ hữu ích nếu bạn có thêm thông tin về những gì bạn đang cố gắng làm. Bản thân 'myClassMethod' có tĩnh không? Nó được gọi từ đâu? Bạn có thể thay đổi các đối số cho phương pháp này không? Mục tiêu của vấn đề bạn đã được chỉ định là gì? – tmpearce

+0

Có vẻ như bạn thực sự cần phải suy nghĩ về hành vi nào bạn có thể muốn ở đây. Sự khác biệt chính với các phương thức tĩnh và không tĩnh là sau này cần truy cập dữ liệu lớp hoặc có thể thực hiện các cuộc gọi ảo trong đó thực hiện nhiều thao tác giống nhau. Nếu 'myClassMethod' gọi' anotherClassMethod' là không tĩnh, bạn có cần phải làm điều này không? Nếu không, làm cho chúng tĩnh. Nếu có, thì bạn mong đợi điều gì sẽ xảy ra khi phương pháp tìm cách truy cập dữ liệu? – Keith

Trả lời

3

Thỏa thuận có gọi chức năng thành viên không tĩnh từ chức năng thành viên static là gì?

Mỗi phi chức năng thành viên tĩnh được thông qua một con trỏ this ngầm ngoài các thông số bạn vượt qua, con trỏ thông qua sau đó được dereferenced để tham khảo các thành viên đối tượng lớp Tuy nhiên static chức năng này không được thông qua với sự ngầm this con trỏ và do đó người ta không thể gọi bất kỳ hàm thành viên không tĩnh nào bên trong một hàm thành viên tĩnh vì không có this để làm như vậy.

Giải pháp là gì, Nếu bạn muốn làm điều đó thì sao?

Bạn sẽ cần một số cơ chế để đưa con trỏ đến đối tượng bên trong phương thức tĩnh và sau đó bạn có thể gọi hàm thành viên bằng cách sử dụng con trỏ đó.
Làm cách nào để thực hiện điều đó?
Bạn sẽ phải lưu con trỏ đến đối tượng lớp trên toàn cầu, hoặc chuyển nó thành một thể hiện trong một đối số hàm cho phương thức tĩnh. Tuy nhiên, điều quan trọng cần lưu ý ở đây là Nếu bạn cảm thấy cần gọi một hàm thành viên không tĩnh thông qua một hàm thành viên tĩnh thì có điều gì đó sai trong thiết kế của bạn.


On suy nghĩ thứ hai có lẽ tôi mis-đọc Câu hỏi của bạn trước, Có lẽ, câu hỏi của bạn là:

Làm thế nào để gọi một hàm thành viên không tĩnh của một lớp từ main?

Bạn cần một phiên bản của lớp để gọi các hàm thành viên không tĩnh.
Vì vậy, cách đơn giản,

MyClass obj; 
obj.myClassMethod(); 

Và kêu gọi bất kỳ chức năng thành viên khác từ bên trong myClassMethod() sẽ chỉ đơn giản là:

void myClassMethod() 
{ 
    //... 
    anyOtherMyClassNonStaticMemberFunction(); 
    //... 
} 
+0

Xin lỗi, tôi là người mới. Làm thế nào tôi sẽ làm điều này? – aclark

+0

@aclark: Vui lòng kiểm tra câu trả lời được cập nhật, tôi đã thêm một số chi tiết khác. Có nghĩa là nó có ý nghĩa không? –

+0

Cảm ơn lời giải thích. Vấn đề là, thiết kế được đưa ra bởi người hướng dẫn, vì vậy tôi phải làm việc với nó. Dường như khá phức tạp với tôi: -/ – aclark

3

Cách duy nhất để gọi một phương thức không tĩnh của một lớp là thông qua một ví dụ về điều đó lớp học. Vì vậy, bạn sẽ cần một cái gì đó như thế này ...

MyClass myClass; 
myClass.myClassMethod(); 
+0

Điều này thật tuyệt. Cảm ơn bạn. – aclark

4

Phương pháp tĩnh là phương pháp không chạy trên bất kỳ đối tượng cụ thể nào. Nó giống như một hàm độc lập bên ngoài một lớp, ngoại trừ việc nó được phép truy cập các thành viên riêng trong lớp của nó.

Nếu bạn anotherClassMethod() không tĩnh, điều đó có nghĩa là nó phải được gọi trên một đối tượng cụ thể, một phiên bản của lớp. Bởi vì nó được gọi trên một đối tượng, nó có thể truy cập dữ liệu được lưu trữ trong đối tượng đó (các biến thành viên không tĩnh). Nếu myClassMethod() là tĩnh và bạn thực hiện nó như

void MyClass::myClassMethod() { 
    anotherClassMethod(); 
} 

Điều đó sẽ không làm việc vì anotherClassMethod() hy vọng sẽ được gọi vào một đối tượng cụ thể, nhưng myClassMethod() không có một. Nhưng nếu bạn biết những gì đối tượng bạn muốn gọi nó, bạn có thể làm điều đó như một phương pháp gọi thông thường trên một đối tượng:

void MyClass::myClassMethod(MyClass &object) { 
    object.anotherClassMethod(); 
} 

Các object không nhất thiết phải được thông qua tại như một cuộc tranh cãi; nó có thể là một biến thành viên tĩnh trong lớp, ví dụ:

class MyClass { 
private: 
    static MyClass theInstance; 

    // ... 
}; 

void MyClass::myClassMethod() { 
    theInstance.anotherClassMethod(); 
} 

Cuối cùng, câu hỏi mà bạn cần phải tự hỏi mình là: tại sao là myClassMethod() tĩnh, và tại sao anotherClassMethod() không tĩnh? Hãy lùi lại một bước, suy nghĩ về những gì myClassMethod() là nghĩa vụ phải làm. Nó có ý nghĩa để gọi nó khi bạn không có một ví dụ để làm việc với? Nếu vậy, tại sao nó cần phải gọi một phương pháp mà dự kiến ​​sẽ làm việc với một thể hiện?

0

Tôi nghĩ rằng có thể bạn có thể sử dụng mẫu đơn, giữ một thể hiện của lớp trong toàn cầu. giống như một lớp tiện ích.

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