2012-03-23 10 views

Trả lời

18

Nó không có gì để làm với nơi bạn xác định chức năng, nó là bạn không xác định các biến thành viên tĩnh, bạn chỉ tuyên bố nó. Bạn cần đặt định nghĩa của nó bên ngoài lớp, ví dụ:

int TT::i; 
+1

+1 Đã xóa câu trả lời của tôi vì tôi nhận thấy bạn đã đóng đinh nó. – Lou

+0

nó hoạt động, nhờ – user956159

2

Biến tĩnh được lưu trong một phần khác của bộ nhớ so với bất kỳ phiên bản nào của lớp. Điều này là bởi vì họ không phải là một phần của một thể hiện của bất kỳ lớp nào.

Mã bên dưới biên dịch vì hàm t không bao giờ được gọi.

class TT 
{ 
private: 
    static int i; 
public: 
    void t() 
    { 
     i=0; 


    } 
}; 

int main(int argc, char *argv[]) 
{ 
    qWarning() << "hi"; 
    TT * t = new TT(); 
    //t->t(); 
    return 0; 
} 

Tuy nhiên, mã này không complie, vì t được gọi là

class TT 
{ 
private: 
    static int i; 
public: 
    void t() 
    { 
     i=0; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    qWarning() << "hi"; 
    TT * t = new TT(); 
    t->t(); 
    return 0; 
} 

Bạn được phép có tài liệu tham khảo không xác định bạn không sử dụng trong C++ (và C cho rằng vấn đề). Đối với một số lý do, tôi không chắc chắn, trình biên dịch dường như nghĩ rằng mã này được tham chiếu i, khi các công cụ trên tuân thủ đã không tham chiếu nó cho đến khi được gọi (bất kỳ ý tưởng là tại sao)?

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

//int TT::i = 0; 

void TT::t(){ 
    i=0; 
} 

chức năng Ví dụ, với các tĩnh định nghĩa:

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

int TT::i = 0; 

void TT::t(){ 
    i=0; 
} 
+2

Lỗi 'không xác định tham chiếu' mà anh ta nhận được là lỗi liên kết không phải là trình biên dịch. –

+0

Hoàn toàn chính xác. Tôi có thói quen xấu gọi bất cứ điều gì xuất hiện trong "biên dịch đầu ra của tôi" giao diện điều khiển một lỗi trình biên dịch. –

+0

Đây là câu trả lời hoàn chỉnh hơn! : D – kotoko

3

tài liệu tham khảo không xác định cho `TT :: i'

là bởi vì bạn havent đã xác định thành viên dữ liệu tĩnh bên ngoài lớp . Tất cả các thành viên dữ liệu tĩnh phải được định nghĩa bên ngoài lớp trước khi sử dụng chúng.

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

void TT::t() 
{ 
    i=0; 
} 
int TT::i=0; // define it outside the class. and if possible initialize