2017-09-24 7 views
0

"Particle"という名前の構造体があり、名前がintに依存するいくつかのオブジェクトを作成したいと思います。 私はforループの中にあるので、名前はpart0、part1、part2のように変更されます。ループ内のオブジェクトを作成する方法名前がintに依存する名前

for (int i = 0; i<num_particles; i++) 
{ 
    //double sample_x, sample_y, sample_theta; 
    string name = "part" + std::to_string(i); 
    Particle name; 
    name.id = i; 
    name.x = dist_x(gen); 
    name.y = dist_y(gen); 
    name.theta = dist_theta(gen); 

    cout << "Sample" << " " << name.x << " " << name.y << " " << name.theta << endl; 

} 

このアプローチがうまくいかないと思いますが、解決方法はありますか?

私は今、これは私の新しいアプローチで、私の質問を更新しました

私はベクトルとint型「粒子の数」作成しました:

std::vector<Particle> particles; 

機能コード:

void ParticleFilter::init(double x, double y, double theta, double std[]) { 
// TODO: Set the number of particles. Initialize all particles to first position (based on estimates of 
// x, y, theta and their uncertainties from GPS) and all weights to 1. 
// Add random Gaussian noise to each particle. 
// NOTE: Consult particle_filter.h for more information about this method (and others in this file). 


default_random_engine gen; 
normal_distribution<double> dist_x(x, std[0]); 
normal_distribution<double> dist_y(y, std[1]); 
normal_distribution<double> dist_theta(theta, std[2]); 

//for (int i = 0; i<num_particles; i++) 
//{ 
    //double sample_x, sample_y, sample_theta; 
    //string name = "part"; 
    //+ std::to_string(i); 
    //Particle particles; 
    particles[num_particles].id =num_particles; 
    particles[num_particles].x = dist_x(gen); 
    particles[num_particles].y = dist_y(gen); 
    particles[num_particles].theta = dist_theta(gen); 
    num_particles++; 
    cout << "Sample" << " " << particles[num_particles].x << " " << particles[num_particles].y << " " << particles[num_particles].theta << endl; 

//} 

} 

しかし、まだ動作しません、 "セグメンテーションフォールト"を出力します。

+2

* *あなたがループ内の変数の別の名前が必要なのはなぜ?ループ内で定義された変数は、そのループ内の* local *であり、ループ内に構築されたオブジェクトは、現在の繰り返しの最後に破棄されます。おそらく、あなたは[良い本をいくつか入手する]必要があります(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。***スコープの詳細については、こちらをご覧ください。*** ? –

+0

"string"や "Particle"型のオブジェクトの場合、変数名 "name"を再利用していることは別として、このようには動作しないような理由はありません。 「パーティクル」に名前を付けるつもりは、文字列フィールドが設定されていることを意味します。 – jwimberley

+3

すでに言われていることにもかかわらず、「_part0、part1、part2_」という形式の変数を作成する必要がある場合は、配列や同様の構文が必要であることを強く示しています。 –

答えて

-3

var0var1var2などのような変数ネーミングの厄介な道を、なぜ捨てたいのですか?私は配列やベクトルを作成することをお勧めします。

コードスニペットから、異なる名前の変数を作成する必要があるのは明らかです。さらに、あなたのコード/ユースケースは、可変スコープという概念にぴったりと合っていません。

+1

この回答は半分のコメントで、半分は答えようとしています。あなたが回答を投稿している場合は、回答を投稿し、コメントを求める仕事ではないことを尋ねないでください。あなたに関連する読書:[なぜコメントするには50の評判が必要ですか?代わりに何をすることができますか?](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reference-to-comment-what-c​​an-i-do-instead) –

0

このコンストラクトはC++で存在し、std::vectorと呼ばれます。

// we want to have a bunch of variables of type Particle 
// all named particles[i] for i == 0,1,2.... 
std::vector<Particle> particles; 

// create a new particle variable 
particles.emplace_back(x, y, theta); 

// print the variable number 42 
std::cout << particles[42]; 
1

単にあなたのコード内でcstdlibitoa()機能を使用することができます。

for (int i = 0; i<10; i++) 
{ 
char a[max]; 
string pa="part_"; 
string name = pa + itoa(i,a,i+1) ; 
cout << "Sample" << " " << name << endl; 

} 
} 

サンプル出力:

Sample part_0 
Sample part_1 
Sample part_2 
Sample part_3 
Sample part_4 
Sample part_5 
Sample part_6 
Sample part_7 
Sample part_8 
Sample part_9 
関連する問題