2016-06-30 13 views
1

私はC++で新しい(プログラミングでは古いものではない)と私はクラス内のベクトルとstrucを扱うことに問題があります。 基本的に私はクラスのメンバーを構造体へのベクトルとポインタの配列を持っていると私は私のmethosに上で動作しますが、イム何かworng /ここメソッドのベクトルと構造体のメンバを使用する方法

は私movement.hある

#pragma once 
using namespace std; 
class movement 
{ 
private: 
    static const int MAX_ROW_PER_TRACKER = 100; 
    static const int MIN_TO_START_CALC = 30; 
    static const int MAX_TRACKERS = 20; 

    struct tracker 
    { 
     int id; 
     double a[MAX_ROW_PER_TRACKER]; 
     double b[MAX_ROW_PER_TRACKER]; 
     double c; 
    }; 
    vector<int> trackersOrder[MAX_TRACKERS] = {}; 
    tracker* trackersArr[MAX_TRACKERS]; 

public: 
    movement(); 
    void addRow(int a, int b, int c); 
    ~movement(); 
}; 

を行うと、私movement.cppそう

#include "stdafx.h" 
#include "movement.h" 
#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

movement::movement() 
{ 
} 

void movement::addRow(int id, int a, int b) 
{ 
    int index; 
    vector<int>::iterator searchID = find(trackersOrder.begin(), trackersOrder.end(), ID); 
    if (searchID == trackersOrder.end()) 
    { 
     vector<int>::iterator freeLocation = find(trackersOrder.begin(), trackersOrder.end(), 0); 
     index = freeLocation - trackersOrder.begin(); 
     trackersOrder.insert(trackersOrder.begin + index, id); 
     structArr[index] = new tracker; 
     structArr[index]->id = id; 
     structArr[index]->a[0] = a; 
     structArr[index]->b[0] = b; 
     structArr[index]->c = 0; 
    } 

} 

movement::~movement() 
{ 
} 

i「がのAddRow」ID方法に送る、とbiは(ベクトルはちょうど私の構造体配列のインデックスを与える)私は出回っ私のベクトルで、このIDを持っている場合、最初にチェックしたいですそうでなければ、idを最初の空の場所に置いてくださいctorとstructs配列/ であるが、メシッドはベクトルと構造体を再構成しないと私は考えている。理由を理解するのを助けることができますか? p.s - 私は自分のコードでもっと間違いがあることを賭けることができます。私のコードは、ポインタとectで試してみます。 (私はMatlabの良い生活から来ているので)私もそれらに学ぶことが幸せになる ありがとう!

+0

が見えるコンパイルありません。 'structArr'は' trackersArr'ですか? – NathanOliver

+0

はいそのはずです!ありがとうございました! – Nadavp

答えて

1

主な問題

問題は、あなたのコード内で、trackersOrderはベクトルが、ベクトルの配列ではないということです。

vector<int> trackersOrder[MAX_TRACKERS] = {}; // array of MAXTRACKERS vectors !! 

ソリューション

あなたが定義した場合それは単純なベクトルとして、それはよりよく動作するはずです:

vector<int> trackersOrder; 

あなたは、そのサイズを設定したい場合は、移動のコンストラクタでそれを行う:

movement::movement() : trackersOrder(MAX_TRACKERS) 
{ 
} 

その他の問題

idでなければなりませんID付きケースタイプミスがあります。

auto searchID = find(trackersOrder.begin(), trackersOrder.end(), id); // by the way auto is easier + ID corrected 

関数ポインタ演算(原文のまま!)に、残念ながら、あなたのイテレータ演算を変換whicn begin後に行方不明()があります

trackersOrder.insert(trackersOrder.begin() + index, id); // corrected 

最後に、交換する必要がありますstructArrのカップルがありますトラッカーによって。

結果は最終的にあなたがタイプミスを持っているように(online demo

+0

うわー、助けてくれてありがとう!私は何かもっと頼むことができますか?私はプログラムの残りの部分を削除する場合は、構造体の配列の終わり/中期または終わりから)どのように私はそれを行うことができますか? – Nadavp

+0

ベクトルについては、['erase()'](http://www.cplusplus.com/reference/vector/vector/erase/)を使用してください。配列の場合、それはより困難です。最も簡単なアプローチは、それらを取り除き、ベクトルだけを使うことです。配列を保持したい場合は、['copy()'](http:// www。cplusplus.com/reference/algorithm/copy/)を使用して、削除する要素を上書きする要素を上書きします。 – Christophe

+0

もう一度ありがとう。私はそれについて考えます。私は今日の最後の問題を解決しなければならないが、私の脳は私に去るように強制すると思う。なぜ私は私のメインウィットインスタンスからの "addRow"メソッドを呼び出すと、初期化の後、このように: "s.addRow(id、a、b);"それは私のスロー "表現は、クラスの型を持つ必要があります"エラー? – Nadavp

関連する問題