Tôi đang xây dựng một thiết kế trò chơi đơn giản cho một dự án của tôi. Tôi có các lớp sau:Con trỏ truyền từ kiểu cơ sở đến kiểu con
class Character
{
public:
virtual void Display();
virtual void SetParameters(char* param, ...);
};
class NonPlayableCharacter : public Character
{
public:
virtual void Display();
virtual void SetParameters(char* paaram, ...);
int GetNPCState();
}
Và sau đó tôi có một nhóm lớp học lấy được từ Ký tự hoặc NonPlayableCharacter. Tôi xác định nó như vậy:
std::vector<Character*> _allChar;
Vấn đề của tôi là tại bất kỳ thời điểm nào tôi muốn thực hiện một số thao tác trên một phần tử của vectơ. Vì vậy, lấy một phần tử ra khỏi vectơ tôi không thể gọi trực tiếp phương thức GetNPCState()
vì phần tử trong vectơ thuộc kiểu Character *. Vì vậy, thực hiện việc này:
_allChar[0]->GetNPCState();
không hoạt động. Vì vậy, tôi đã cố gắng làm việc đó với dynamic_cast nổi tiếng:
NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
test->GetNPCState();
Vấn đề với nỗ lực cuối cùng này là GetNPCState()
tai nạn vì đối tượng là null, và tôi biết một thực tế (thông qua gỡ lỗi) mà _allChar [0] isn' t null.
Bạn nhận được một con trỏ rỗng khi đối tượng bạn đang cố gắng truyền tới 'NonPlaya bleCharacter' không thực sự là một 'NonPlayableCharacter'. Có lẽ một số đối tượng trong vectơ được lấy trực tiếp từ 'Character'. – jogojapan
Là một sang một bên, tôi làm việc với một thành phần (s) trong đó sử dụng nhiều vectơ của con trỏ. Nó đã gây ra rất nhiều rắc rối cho tôi, vì vectơ này kết thúc đôi khi với con trỏ tới bộ nhớ đã bị xóa, và nó dẫn đến tham nhũng bộ nhớ. Tôi đoán rằng bạn sử dụng một vector con trỏ bởi vì bạn đang sử dụng nó đa hình, và/hoặc các đối tượng được chia sẻ.Trong cả hai trường hợp, tôi sẽ khuyên bạn nên thay đổi vectơ của bạn để giữ kiểu con trỏ được chia sẻ (ví dụ 'std :: shared_ptr') hoặc thay đổi vectơ thành' boost :: ptr_vector' (điều này rất tốt cho cả hai kịch bản). Chúc may mắn với trò chơi! – Dennis