2010-10-11 48 views
13

Tôi có một lớp C++ trừu tượng không có hàm tạo. Nó được cho là một lớp cơ sở để các lớp khác có thể kế thừa từ nó. Những gì tôi đang cố gắng làm là khai báo một biến cố định trong lớp cơ sở và khởi tạo nó trong mỗi hàm tạo của lớp dẫn xuất nhưng không có nơi nào khác trong mỗi lớp đó. Có hợp pháp trong C++ không? Nếu vậy, làm thế nào tôi có thể làm điều đó?Làm thế nào tôi có thể khởi tạo một biến const của một lớp cơ sở trong một lớp khởi tạo 'constructor trong C++?

Trả lời

19

Có hợp pháp trong C++ không?

No. Không đổi phải được khởi tạo trong hàm tạo lớp cơ sở.

Giải pháp là cung cấp một hàm tạo thích hợp trong lớp cơ sở của bạn - nếu không nó không thể được sử dụng. Hơn nữa, không có lý do gì để không cung cấp cho nhà xây dựng đó.

class Base { 
    int const constant; 
public: 
    virtual ~Base() = 0; // Makes this an abstract base class. 
protected: 
    Base(int c) : constant(c) { } 
}; 

// Must be implemented! 
Base::~Base() { } 

class Derived : public Base { 
public: 
    Derived() : Base(42) { } 
}; 
+0

Nếu bạn làm cho hàm tạo lớp cơ sở 'được bảo vệ' thì bạn không phải lo lắng về bất kỳ ai khác đang trực tiếp tạo nó. – Zooba

+0

Tôi nghĩ nếu có một hàm tạo trong một lớp cơ sở trừu tượng, nó không còn trừu tượng nữa vì nó có thể được khởi tạo. Liệu tôi có sai? – user246392

+0

@Zooba: Đúng. Xem mã cập nhật của tôi. ;-) Ngoài ra, còn có các cách khác để tạo ra một lớp trừu tượng cơ sở (tức là không thể khôi phục). Cách tiêu chuẩn là cung cấp một hàm ảo thuần túy (ví dụ: thuận tiện cho destructor, mà ** phải ** là ảo anyway). –

0

Tại sao bạn không tạo một trình tạo bảo vệ trong lớp cơ sở trừu tượng và đặt giá trị không đổi ở đó?

1

Nếu ở tất cả các bạn cần phải làm điều đó theo cách này:

struct Base { 
    Base(std::string const & someValue) 
    : const_value(someValue) { 
    } 
protected: 
    std::string const const_value; 
}; 

struct Derived : Base { 
    Derived() 
    : Base("Derived"){ 
    } 
}; 

Lý do cho điều này là bạn chỉ được phép gán giá trị cho một giá trị const lúc khởi tạo. Khi Base được khởi tạo, bạn không còn được phép sửa đổi giá trị. Vì vậy, bạn phải làm theo cách đó như được hiển thị ở trên.

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