2016-05-06 14 views
0

で選択してください::私は以下のような問題を持っているC++での実行時の配列やベクトル

class datad { 
    private: 
     int *a; 
     int _size; 
     vector<int> v; 

    public: 
     datad(int arr[], int size) { 
      _size = size; 
      for (int i = 0; i < size; i++) 
       a[i] = arr[i]; 
     } 
     datad(vector<int> ve) 
     { 
      v = ve; 
      _size = ve.size(); 
     } 

     void printdata() 
     { 
      // print data which the object has been initialized with 
      // if object is initialized with vector then print vector 
      // array print array 
     } 
    }; 

    int main() 
    { 
     // print only vector data 
    int a[] = { 9,4,8,3,1,6,5 }; 
    datad d(v1); 
    d.printdata(); 

    // print only array data 

    datad d1(a, 7); 
    d1.printdata(); 
} 

私は、オブジェクトを初期化し、同じに基づいている方法はaccrodingly印刷データすることができるはず見つける必要があります。 誰かが私にそれが可能であるかどうかを理解するのを助けることができますか?

+0

'ベクトル'は 'T *'とバイナリ互換性のあるポインタを返すことができます。 – StoryTeller

+0

あなたはあなたの答えを持っていますが、私はまだ本当に知りたがっています...なぜ両方をするのですか? – StoryTeller

+0

私は理解できます。これは私が使用しているコードの一部ではありません。これは私が探しているものの一例です。 –

答えて

3

bool usesVectorをクラスに追加し、適切に各コンストラクタ内でtrueまたはfalseに設定します。次に、printdataにブール値の値をチェックするだけです。 (それはそれ以外の場合は未使用だとして)

それともあなたは、ベクターの場合には-1sizeを設定することができますし、それだけのために確認してください。

ちなみに、配列の実装は壊れています。なぜなら、メモリを割り当てないためです。 多くの場合より良いオフを使用してベクトルバージョンです。必要に応じて配列データからそのベクトルを初期化することもできます。

+1

+1 "for the vector version only" stlにアクセスしたときにその危険なint *を保持する意味がありません。 – DeathTails

+0

私はあなたのソリューションを受け入れますが、私の指摘は、オブジェクトがどのように初期化されたかを知ることです。これは私の言いたいことの一例です。 –

+0

論理的には、オブジェクトの状態やその初期化の方法を理解するために、オブジェクトに対するより多くの力が必要であると予想しています。 C++での実用的なアプリケーションはほとんどないようです。とにかく親愛なる、ありがとう。 –

1

各コンストラクタにフラグを設定し、そのフラグを印刷方法で確認できます。

私はこれが学習目的であることを望みます。そうでない場合は、ベクターバージョンだけを使用する方がよいでしょう。クラスで動的メモリ管理を使用する場合は、規則のようなものを知る必要がありますthreeと私は5つのルールもあると思います。

+0

1つのケースでは、サイズを負の値に設定し、別のメンバーのスペースを節約してください。 – StoryTeller

+0

@StoryTeller:それは良い考えです。それを盗む...;) –

+0

@ LightnessRacesinOrbit、私はそれを喜んで共有すれば盗むことはありません:) – StoryTeller

関連する問題