2012-11-11 53 views
8

Tôi có một lớp như ::chức năng tĩnh gọi phi tĩnh trong C++

Class Test 
{ 
    public: 
    void Check(){//dosomething}; 
    static void call(){//I want to call check()}; 
}; 

Bởi vì cuộc gọi() là một thành viên tĩnh, vì vậy nó không thể gọi chức năng không tĩnh, vì vậy tôi nghĩ rằng để sử dụng Kiểm tra() trong cuộc gọi() là để tạo ra thử nghiệm con trỏ và sau đó điểm đến Kiểm tra(), nhưng tôi nghĩ rằng nó không phải là tốt, là có một cách tốt hơn để làm điều này? Tôi có thể viết lại tất cả mọi thứ trong hàm tĩnh, vì vậy tôi không cần gọi lại Check(), nhưng những gì tôi muốn là sử dụng lại mã trong Check() và tránh lặp lại mã.

+0

Không rõ bạn đang cố gắng làm gì.Bạn có thể tìm ra hàng triệu cách để hack xung quanh nó bằng ngôn ngữ, nhưng cuối cùng lý do bạn ở trong tình huống này là yêu cầu của bạn không có ý nghĩa gì cả. Không có ngữ cảnh đối tượng trong 'cuộc gọi'. Tại sao bạn nghĩ rằng bạn cần phải làm điều này? –

+0

Tại sao không khai báo 'Kiểm tra 'một hàm tĩnh? –

+1

Bạn cần một cá thể 'kiểm tra lớp' để gọi bất kỳ hàm không tĩnh nào (tức là con trỏ 'this'). – mark

Trả lời

9

Vì bạn cần một ví dụ, bạn có thể sở để tạo ra một, sử dụng một trường hợp tĩnh, hoặc pas nó để call():

Class Test 
{ 
    private: 
    static Test instance; 

    public: 
    void Check(){//dosomething}; 
    // use one of the following: 
    static void call(Test& t){ t.check(); }; 
    static void call(){ Test t; t.check(); }; 
    static void call(){ instance.check(); }; 
}; 
+1

Làm cách nào để đặt biến mẫu? – JavaRunner

3

Điều này nghe có vẻ như có một số thiết kế xấu đang diễn ra.

Nhưng dù sao, những gì bạn có thể làm, là tạo một thể hiện Kiểm tra trong cuộc gọi và gọi Kiểm tra trên cá thể đó. Việc thực hiện các cuộc gọi sẽ là một cái gì đó như thế này thì:

void call(){ 
    Test test; 
    test.Check(); 
} 

Tuy nhiên, lưu ý rằng nếu Checker thực hiện một cái gì đó với các thành viên của thử nghiệm, nó sẽ ofcourse chỉ áp dụng cho các đối tượng thử nghiệm tạo ra. Tôi sẽ suy nghĩ lại xem bạn có thực sự muốn gọi là tĩnh hay không.

0

Không có câu trả lời đơn giản cho việc này. Có nhiều thứ bạn có thể làm, nhưng điều đó đúng tùy thuộc vào ý nghĩa của mã của bạn. Đó là câu hỏi thiết kế, không phải là câu hỏi lập trình.

Bạn đã đề xuất nhiều thủ thuật lập trình khác nhau mà bạn có thể làm, như tạo con trỏ Test (thực ra bạn không cần con trỏ Test, chỉ cần đối tượng Test). Tôi có thể đề xuất nhiều thủ thuật hơn, ví dụ bạn có thể viết lại call() để nó không tĩnh, hoặc (rất gần giống nhau) bạn có thể chuyển con trỏ Test làm tham số call() và sử dụng hoặc bạn có thể tạo đối tượng Test toàn cầu và dùng nó. Không ai trong số này nhận được trái tim của vấn đề. Để trả lời câu hỏi của bạn, bạn phải tự hỏi mình những câu hỏi như thế nào, tại sao tôi làm cho static call() ở vị trí đầu tiên, tại sao một hàm tĩnh cần gọi hàm không tĩnh.

Nếu bạn có thể giải thích điều đó, sau đó sẽ dễ dàng hơn để đưa ra lời khuyên cụ thể hơn.

0

Điểm khác biệt quan trọng giữa chức năng thành viên không tĩnh và tĩnh là sau này không có đối tượng nào. Tuy nhiên, nó vẫn có các đặc quyền truy cập giống như tất cả các thành viên khác.

Khi bạn muốn gọi hàm thành viên không tĩnh từ một thành viên tĩnh, bạn vẫn cần phải tìm ra một đối tượng, tuy nhiên. Thông thường, hàm thành viên tĩnh sẽ được truyền trong một số ngữ cảnh để đến một đối tượng. Từ những âm thanh của câu hỏi của bạn có vẻ như các chức năng tĩnh và không tĩnh có nghĩa là để làm những việc tương tự mà không yêu cầu và đối tượng. Trong trường hợp này nó có lẽ là tốt nhất để yếu tố phần chung, không phụ thuộc vào bất kỳ đối tượng, vào một chức năng mà sau đó được gọi là từ cả hai call()Check():

void Test::call() { 
    common(); 
    // ... other code 
} 
void Test::Check() { 
    common(); 
    // ... other code, possibly depending on "this" 
} 
void Test::common() { 
    // logic shared by both call() and Check() but not depending on "this" 
} 

Nếu mã thông thường cần một đối tượng, không có cách khác hơn là đến với một đối tượng trong hàm thành viên tĩnh của bạn.

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