のコンストラクタB
はOKですが、呼び出す方法は次のpush_back()
とおりではありません。
btest.push_back(B(A));
これを行う必要があります:
btest.push_back(B(test));
B
さらに、コンストラクターは次のようにマークされていないため、オブジェクトを明示的に構築する必要はありませんexplicit
。
btest.push_back(test);
また、生のポインターではなく自動メモリ管理を使用することを検討してください(std::vector<>
配列の代わりに、ポインターの代わりにスマートポインター)。このようにして、これを忘れたためにメモリリークが発生するのを防ぐことができます。
delete test;
さておき、最悪のことは、初期化されていない変数(ループA
内のメンバー変数)の値を使用するため、コードにも未定義動作があることです。for
最後に:
、クラス定義でクラス名の後に使用しないでください。これは、C++11でコードを書き直す方法です。
#include <vector>
#include <cstdio>
struct A // Do not use ":" here, that's for introducing inheritance,
// which you are not using in your example.
{
float mem1 = 0.0; // In C++11, you can specify default initialization
int mem2 = 0; // for your member variables this way. In C++03 you
// would have to define a default constructor which
// initializes your member variables to the desired
// value.
};
struct B
{
std::vector<A> Aarr;
// ^^^^^^^^^^^^^^
// Prefer using standard containers over dynamically allocated arrays, as
// it saves your from taking care of memory management and avoids leaks.
explicit B(size_t s): Aarr(s) { }
// ^^^^^^^^
// It is usually a good idea to mark constructors which take on argument
// and are not copy constructors as explicit, to avoid awkward implicit
// conversions.
};
int main()
{
std::vector<B> btest;
btest.push_back(B(5));
// ^^^^
// We need to explicitly construct an object of type B,
// because we have marked B's constructor as explicit.
for(int i=0; i<5; i++)
{
std::printf(
"mem1: %f, mem2: %i \n",
btest[0].Aarr[i].mem1,
btest[0].Aarr[i].mem2
// ^
// You had "mem1" here.
);
}
}