2016-06-07 282 views
-1

我不斷收到這個錯誤在控制檯:空引用異常C++

未處理的異常信息:System.NullReferenceException

下面的代碼:

class Car { 
public: 
    int X; 
    int Y; 
}; 

class SpecificCar : public Car { 

}; 

class Container { 
public: 
    int AmountOfCars = 0; 
    Car **cars = nullptr; 
    void AddCar(Car *ptr); 
}; 

void Container::AddCar(Car *ptr) { 
    if(AmountOfCars == 0) { 
    cars[0] = ptr; //Debbuger says that the problem in question is located here 
    AmountOfCars++; 
    } 

int main() { 
    Container container; 
    Car *ptr = new SpecificCar; 
    ptr->X = 1; 
    ptr->Y = 5; 
    container.AddCar(ptr); 
} 
+2

'cars'爲null,但您正在嘗試使用它。忘記指針廢話並使用'std :: vector'。 – emlai

+0

這就是這件事的全部重點。我不想使用矢量。 – ElChupa

+1

然後你需要爲'cars'分配一些內存來指向。 – emlai

回答

0

當你Container設計不存儲Car s,它仍然需要存儲指向汽車的指針。你必須想出一個方法。該標準提供std::vector<Car>以及std::vector<Car*>,但您可以自由想出其他任何東西。不過,如果你不需要標準方法,那麼你真的想要做什麼就取決於你。

0

Car **cars不是一個動態容器,它是一個指向內存區域的指針。你在那裏做的是完全錯誤的。你還必須分配數組的指針,以便能夠有數據填充,如

cars = new Car*[5]; 

這樣,您可以用指數從0到地址4的內部陣列cars[]。然而,這不是動態的,你最好的選擇是std::vector<Car*>,如果你想走自己的路,那麼malloc()/realloc(),如果你真的想打擾它,也許鏈接列表。

0

問題是,在類Container中,您定義了一個成員cars,初始化爲nullptr

解決此問題的最佳方法是對cars使用std::vector<Car*>。 (爲什麼?)如果你絕對不希望使用矢量,在Container類,你可以更換:

Car **cars = nullptr; 

通過類似:

static const int MAX_AMOUNT_OF_CARS = 100; 
Car* cars[MAX_AMOUNT_OF_CARS]; 

將定義的Car*適當陣列;那麼,你將能夠使用cars[0],cars[i],...

0

我想你是想教你自己關於內存管理。我已經重寫了你的班級,並且AddCar()是你想要的。訪問或取出汽車並刪除容器留給學生練習。 (看看這是僞代碼,我沒有編譯或運行它)

class Container 
    { 
      Car ** cars_ = nullptr; 
      int capacity_ = 0;  // how much room we have for car pointers 
      int AmountOfCars_ = 0; // how many car pointers we actually contain 
     public: 
      int AmountOfCars() const { return AmountOfCars_; } 
      void AddCar(Car *ptr); 
    }; 

    void Container::AddCar(Car *ptr) 
    { 
     if (AmountOfCars_ + 1 > capacity_) // ensure we have capacity for another Car * 
     { 
      if (capacity_ == 0) // if we have none set to 2, so we'll initially allocate room for 4 
       capacity_ = 2; 
      int newcapacity = capacity_ * 2;     // double the capacity 
      Cars ** newcars = new Car*[ newcapacity ];   // allocate a new pointer array 
      memcpy(newcars, cars_, capacity_ * sizeof(Car*)); // we're just moving pointers 
      delete cars_;          // get rid of the old pointer array 
      cars_ = newcars;         // point to the new pointer array 
      capacity_ = newcapacity;       // update the capacity 
     } 
     ++AmountOfCars_;          // increase the number of cars 
     cars[ AmountOfCars_ ] = ptr;       // and copy the pointer into the slot 
    } 
+0

在現實世界中,你會使用'std :: vector'。你自己寫一個真正的項目是一個傻瓜。 –