編集:2D構造の場合(そして、2D構造の大きさがわかっていると言ったので、ループ内の10は希望する2D配列のサイズであると想定します。
#include <iostream>
#include <vector>
using namespace std;
class Bar {
public:
int BarInfo;
};
class Foo {
public:
Foo() {
// Allocates 10 vector spots for 10 bar elements - 100 bars, 10 x 10
for (int i = 0; i < 10; i++) {
// Puts 10 bars pointer at the end;
// Heap-allocated (dynamically), which
// means it survives until you delete it
// The [10] is array syntax, meaning you'll have 10 bars
// for each bars[index] and then
// you can access it by bars[index][0-9]
// If you need it to be more dynamic
// then you should try vector<vector<Bar>>
bars.push_back(new Bar[10]);
}
}
Bar* operator[] (int index) {
return bars[index];
}
~Foo () {
// Cleanup, because you have pointers inside the vector,
// Must be done one at a time for each element
for (int i = 0; i < bars.size(); i++) {
// TODO: how to clean up bars properly?
// Each spot in the vector<> contains 10 bars,
// so you use the array deletion
// and not just regular 'delete'
delete[] bars[i]; // deletes the 10 array elements
}
}
private:
// vector might not be a bad idea.
vector<Bar*> bars;
};
これは私が書いたコードをテストするために持っているメインであり、2D配列が機能するはずだと思うように機能します。
int main ( int argc, char* argv[] ) {
Foo foo;
// Bar at 1st row, 2nd column ( row index 0, column index 1 )
// Bar& is a reference
Bar& bar12 = foo[0][1];
bar12.BarInfo = 25;
int stuffInsideBar = foo[0][1].BarInfo; // 25
return 0;
}
それがあなたを助け、あなたがしていることに近づくことを願っています。Foo
ここでは、スターターヘッドを越えて、2D配列と同じようにクラスを動作させる手法を使用しました。これは、演算子のオーバーロードと呼ばれます。これはC++の強力な機能であるため、より多くの基本をマスターすると、将来のプロジェクトまたは現在のプロジェクトで役立つ可能性があります。幸運を!
~~~~~~~~~~~~~~~~~~~~~~~
編集前の古い回答
~~~~~~~~~~~~~~~~~~~~~~~
間接参照が多すぎるようです。他の人の答えはあなたが何とかしてやったことを片付ける方法をあなたに示しますが、あなたはあなたがクラスをどのように正確に扱っているかを変えることから利益を得ることができると思います。
#include <iostream>
#include <vector>
using namespace std;
class Bar {};
class Foo {
public:
Foo() : bars() {
// bars is no longer a pointer-to-vectors, so you can just
// allocate it in the constructor - see bars() after Foo()
//bars = new vector<Bar>();
for (int i = 0; i < 10; i++) {
// Puts 1 bar pointer at the end;
// Heap-allocated (dynamically), which
// means it survives until you delete it
bars.push_back(new Bar());
}
}
~Foo () {
// Cleanup, because you have pointers inside the vector,
// Must be done one at a time for each element
for (int i = 0; i < 10; i++) {
// TODO: how to clean up bars properly?
// TODOING: One at a time
delete bars[i]; // deletes pointer at i
}
}
private:
// You don't need to ** the vector<>,
// because it's inside the class and
// will survive for as long as the class does
// This vector will also be copied to copies of Foo,
// but the pointers will remain the same at the time
// of copying.
// Keep in mind, if you want to share the vector, than
// making it a std::shared_ptr of a
// vector might not be a bad idea.
vector<Bar*> bars;
};
クラスを参照によって関数に渡すと、クラスのvector<Bar*>
内部はそれ自体をコピーしたり削除したりせず、単一のスタックフレームを超えて永続化されます。
あなたのmain
場合、これは適切にクリーンアップする必要があり、ベクトル**よりも追跡がはるかに簡単です。ただし、何らかの理由でvector **が必要な場合は、home_monkeyの回答よりも役立つはずです。