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++?
13
A
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
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
- 1. C++ Khởi tạo lớp cơ sở 'const int trong lớp dẫn xuất?
- 2. Khởi tạo lớp C++ chứa khởi tạo biến lớp
- 3. Làm thế nào để khởi tạo một biến const bên trong một struct trong C?
- 4. khởi tạo một lớp bằng biến chuỗi trong C#?
- 5. Làm thế nào để khởi tạo một mảng thành viên của lớp trong constructor?
- 6. Tôi có thể khởi tạo một lớp ẩn danh trong hàm tạo của lớp ngoài không?
- 7. Tôi có thể khởi tạo một lớp PHP bên trong một lớp khác không?
- 8. Khởi tạo một lớp bằng trình khởi tạo siêu lớp
- 9. Làm thế nào tôi có thể khởi tạo một lớp đang có hàm tạo riêng tư
- 10. Làm thế nào để khởi tạo biến thành viên tham chiếu của một lớp?
- 11. Làm cách nào để tạo một lớp trong C# mà tôi có thể khởi tạo giống như một chuỗi?
- 12. khởi tạo tăng :: multi_array trong một lớp
- 13. Làm cách nào để khởi tạo một std :: vector trong một hàm tạo lớp trong C++?
- 14. Gọi hàm tạo lớp cơ sở sau (không có trong danh sách khởi tạo) trong C++
- 15. const tham chiếu phải được khởi tạo trong constructor cơ sở/thành viên initializer danh sách
- 16. Khởi tạo một lớp mới từ tên của một biến trong một không gian tên
- 17. Khởi tạo biến lớp Python
- 18. làm thế nào để khởi tạo một đối tượng của lớp từ chuỗi trong Objective-C?
- 19. Lớp nào có getClass() báo cáo bên trong một hàm tạo của một lớp cơ sở
- 20. BroadcastReceiver: không thể khởi tạo lớp; không có constructor rỗng
- 21. Khởi tạo trong Constructor
- 22. Khởi tạo một Lớp động qua biến số
- 23. Khởi tạo một const char * tĩnh mảng
- 24. Khởi tạo một đối tượng mới từ lớp trong Enum
- 25. Khởi tạo một lớp Python từ tên
- 26. Cách khởi tạo một lớp học?
- 27. Khởi tạo lớp python trong C#
- 28. Có thể tạo một lớp dẫn xuất từ một hàm tạo lớp cơ sở không?
- 29. Java Khởi tạo một lịch trong một constructor
- 30. Tôi có thể khởi tạo một công đoàn trong bộ khởi tạo mem không?
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
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
@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). –