2016-08-18 2 views
-1

私はベクターにポインタを追加する機能を持っています。ポインタにpush_backをフォーマットする方法は?

#include "Car.hpp" 
using namespace std; 

bool CarManagementSystem::addCar(Car::CarType new_car_type) { 
    if (Car::CarType(new_car_type) == (Invalid)) { 
     return false; 
    } 
    else{ 
     new Car::CarType(new_car_type); 
     carVector.push_back(Car::CarType(new_car_type)); 
     return true; 
    } 
} 

私は制約がでになりたいものを形にのようにpush_backコマンドはしかし午前、私は私の対象車の種類を作成するには、この機能を使用できるようにしたい。私に悲しみの多くを与えていますどのようにこれを行うかわかりません。

車のクラスは、すべての異なるタイプの車のための完全に仮想の基本クラスです。

#include "Car.hpp" 

Car::~Car() { 
} 

Car::CarType Car::type() const { 
    return AT_INVALID; 
} 



class CarSystem { 
private: 
    double Balance; 
    double CarCost; 
    std::vector<Car*> carVector; 
... 
+2

まず、ポインタが必要ですか?第二に、C++の正しい構文を学ぶために、[良いC++の本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)が必要なように聞こえます。 – NathanOliver

+4

これはコードはかなり奇妙です。例えば 'new Car :: CarType(new_car_type);の唯一の目的はメモリリークを作成することです。 –

+0

[最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 'carVector'の定義(または少なくとも宣言)を含みます。 –

答えて

2

あなたのベクトルは車*のベクトルでなければなりません:ベクトルは、基本クラスの車から派生したクラスを意味し、車の具体的なバージョンで満たされるべき

std::vector<Car*> carVector; 

class Van : public Car 
{ 
    ... 
}; 

... 

Van* newVan = new Van(); 

carVector.push_back(newVan); 

ここにVan *もCar *です。 ある時点でベクトルの内容を削除するか、スマートポインタを使用するようにしてください。

車の種類を示すCarクラスの列挙型を持つ方がよい場合があります。ポインタを処理する必要はありません。

+2

_ "車の種類を示すCarクラスの列挙型を持つ方が良い解決策かもしれません"、それが良いかどうかは議論の余地があります。生ベクターを 'vector'に格納するのは間違いです。' std :: vector > 'または' std :: vector > 'でなければなりません。 –

+0

私はスマートポインタの使用について述べました。私たちが多くの情報を持っていないときには、ここで多くの具体的なアドバイスをするのは難しいです。 –

0

あなたが持っている悩みは、このコード・フラグメントは、あなたが何を考えて行っていないということです。

new Car::CarType(new_car_type); 
    carVector.push_back(Car::CarType(new_car_type)); 
  • 最初の行は、新しいCarTypeオブジェクト(列挙型、int型へのポインタを作成し、Iどのように定義したか分かりません)。このポインタはすぐに失われ、メモリリークが発生します。

  • 2番目の行は、CarTypeオブジェクトをpush_backしようとします。これは明らかにポインタではありません。

あなたのコードには、CarTypeがあり、コンクリート車を構成するファクトリ関数がありません。 Carがインスタンス化できない抽象型である場合、またはCarTypeの周りにいくつかのバリエーションがある具体的なクラスであるかどうかは、コードで明確ではありません。

CarがパラメータとしてCarTypeを取るコンストラクタを持っている場合は、のような何かをする必要があるでしょう:

bool CarManagementSystem::addCar(Car::CarType new_car_type) { 
    ... 
    else{ 
     carVector.push_back(new Car(new_car_type)); 
     return true; 
    } 
} 

しかしCarは、派生クラスと抽象型である場合は、あなたが何かのために行くだろう。

bool CarManagementSystem::addCar(Car::CarType new_car_type) { 
    Car *c; 
    switch (new_car_type) { 
     case AT_SUV: 
      c = new SUV; // if SUV would be a class derived from Car 
      break; 
     case AT_RACING_CAR: 
      ... 
     case AT_INVALID: 
     default: 
      return false; 
    } 
    carVector.push_back(c); 
    return true; 
} 

あなたは、この場合には、そのようなthis tutorialで説明したものと素敵なFactory Methodパターンの実装に興味があるかもしれません。

関連する問題