0

想像

std::vector<std::vector<Objekt>> m_pole;

すべてのオブジェクトを nullptr に設定します。ただし、次のコードでは 2 つのエラーが発生します。Vars row と col は宣言されていません。

    std::vector<std::vector<Objekt>>::std::iterator row;
    std::vector<Objekt>::std::iterator col;

    for(row = m_pole.begin(); row != m_pole.end(); row++) {
        for(col = row->begin(); col != row->end(); col++) {
            m_pole[row][col] = nullptr;
        }
    }

この問題を解決する方法はありますか? 答えてくれてありがとう、MK。

4

3 に答える 3

2

あなたは複数のことを混乱させているようです。

まず、オブジェクトのベクトルのベクトルがあります。それは良い!ただし、これはオブジェクトであり、ポインタではありません(これも良いです)。したがって、ポインタだけがnullになる可能性があるため、nullにすることはできません(最後にもう一度、これは良いです。無効なメモリアクセスはなく、nullポインタの例外があります…)。オプションの要素を処理する場合は、さまざまな戦略から決定する必要があります。

  1. それらを構造に挿入しない
  2. ポインタを使用してnullに設定する(その場合は、スマートポインタを使用してください)
  3. boost::optionalを使用する

第二に:あなたはポインタとインデックスを混乱させています

std::vector<std::vector<Objekt>>::iterator row_it; // where does this std came from ?
std::vector<Objekt>::iterator element_it; // the iterator points to an element

for(row_it = m_pole.begin(); row_it != m_pole.end(); ++row_it) { // Get the habit to pre-increment
    for(element_it = row_it->begin(); element_it != row->end(); ++element_it) {
        *element_it = nullptr; // This won't work, as it's an object, not a pointer
    }
}

第三に:c ++ 11には素晴らしいイテレータがあります(それ以外の場合はBOOST_FOREACHを使用します):

for(auto & row : m_pole) // reference is importante !
    for(auto & element : row)
        element = nullptr; // again, can't work because it's an object
于 2012-12-24T20:24:35.357 に答える
1

イテレータとインデックスを混同しています。イテレータは、*演算子を使用して逆参照されます。

for(row = m_pole.begin(); row != m_pole.end(); row++) 
{
  for(col = row->begin(); col != row->end(); col++)
    *col = nullptr;
}

これはObjekt、がポインタのtypedefであるか、をとることができる代入演算子を持っていることを前提としていますnullptr。それ以外の場合は、を使用する必要がありますObjekt*

ただし、初期化ループを作成する手間を省き、std::vectorコンストラクターを使用するだけで済みます。

std::vector<std::vector<Objekt> > m_poles(numrows, std::vector<Objekt>(numcols, nullptr));
于 2012-12-24T20:29:04.153 に答える
0

ポインタを使用する必要があります:

std::vector<std::vector<Objekt*>> m_pole;
std::vector<std::vector<Objekt*>>::std::iterator row;
std::vector<Objekt*>::std::iterator col;

for(row = m_pole.begin(); row != m_pole.end(); row++) {
    for(col = row->begin(); col != row->end(); col++) {
        *col = nullptr;
    }
}
于 2012-12-24T20:23:57.020 に答える