2010-04-29 54 views
8

Tôi có những C++ lớp:biến tĩnh trong phương pháp tĩnh trong lớp cơ sở và thừa kế

class Base 
{ 
protected: 
    static int method() 
    { 
     static int x = 0; 
     return x++; 
    } 
}; 

class A : public Base 
{ 

}; 

class B : public Base 
{ 

}; 

sẽ biến tĩnh x được chia sẻ giữa AB, hoặc mỗi một trong số họ sẽ có riêng của nó độc lập x biến (đó là những gì tôi muốn)?

+2

Đây có phải là điều bạn không thể kiểm tra nhanh chóng bằng trình biên dịch và một số mã thử nghiệm không? –

+2

@ttmrichter: không nếu có bất kỳ nghi ngờ nào, nó có thể phụ thuộc vào việc triển khai thực hiện. Và vào thời điểm bạn đã kiểm tra nó không phải là, bạn đã tìm thấy câu trả lời. –

+0

@ttmrichter Tôi nghi ngờ rằng biến sẽ được chia sẻ, nhưng tôi cũng muốn xem liệu có ai có cách giải quyết vấn đề của tôi không :) – Meh

Trả lời

14

Sẽ chỉ có một phiên bản x trong toàn bộ chương trình. A nice công việc xung quanh là sử dụng CRTP:

template <class Derived> 
class Base 
{ 
protected: 
    static int method() 
    { 
     static int x = 0; 
     return x++; 
    } 
}; 

class A : public Base<A> { }; 
class B : public Base<B> { }; 

này sẽ tạo ra một khác nhau Base<T>, và do đó một biệt x, cho mỗi lớp dẫn xuất từ ​​nó.

Bạn cũng có thể cần cơ sở "Cơ sở" để giữ lại đa hình, như Neil và Akanksh chỉ ra.

+0

Tốt, bạn đã đăng trong khi tôi sắp gửi :). – Akanksh

+2

Nhưng những gì bạn không nhận được là đa hình, nếu đó là bắt buộc. –

+0

Cảm ơn, tôi quên rằng tôi đã giải quyết một vấn đề rất giống với nhiều năm trước đây, cũng với CRTP :) Không yêu cầu – Meh

3

Sẽ chỉ có một, được chia sẻ bởi cả ba lớp. Nếu bạn muốn các cá thể riêng biệt, bạn sẽ phải tạo các hàm riêng biệt trong các lớp dẫn xuất.

2

Cũ. Biến tĩnh cục bộ được ràng buộc với phương thức chứa chúng, và method tồn tại trong một hóa thân cho tất cả các lớp con (trên thực tế, cho toàn bộ ứng dụng, mặc dù phần còn lại của chương trình không thấy phương thức).

1

Biến sẽ được chia sẻ - nó là theo chức năng - trong trường hợp này, hàm thuộc về Base::method(). Tuy nhiên nếu class Base là một lớp mẫu, bạn sẽ nhận được một thể hiện của biến cho mỗi instantiation (mỗi tập duy nhất của các tham số mẫu thực tế) của mẫu class Base - mỗi instantiation là một hàm mới.

1

Nếu bạn tạo X là tĩnh thì nó sẽ được chia sẻ giữa tất cả các lớp con. Không có vấn đề với chức năng tĩnh.

3

Tôi khá chắc chắn nó sẽ được chia sẻ giữa A và B.

Nếu bạn muốn biến độc lập, bạn có thể sử dụng "mẫu Template Tò mò định kỳ" như:

template<typename Derived> 
class Base 
{ 
protected: 
    static int method() 
    { 
     static int x = 0; 
     return x++; 
    } 
}; 

class A : public Base<A> 
{ 

}; 

class B : public Base<B> 
{ 

}; 

Tất nhiên nếu bạn muốn đa hình, bạn sẽ phải xác định một lớp thậm chí là "Baser" mà cơ sở có nguồn gốc từ, như Base<A> là khác nhau từ Base<B> như:

class Baser 
{ 
}; 

template<typename Derived> 
class Base : public Baser 
{ 
protected: 
    static int method() 
    { 
     static int x = 0; 
     return x++; 
    } 
}; 

class A : public Base<A> 
{}; 

class B : public Base<B> 
{}; 

Bây giờ A và B cũng có thể được đa hình.

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