0

私は C++ プログラミングが初めてで、基本的な問題があります。N 個のオブジェクトを作成したいのですが、N は実際にはユーザー入力です。

私は、 beam1、beam2、...、beamXなどのオブジェクト名を持つことに具体的です。

2つの簡単なこと

  1. C++ でこのように動的オブジェクトを作成することは可能ですか?
  2. もしそうなら、どうすればいいですか?私はあなたの参考のためにコードを貼り付けています..

        #include "iostream"
        # include <conio.h>
        using namespace std;
    
        // Static member variable is defined outside the class..
        class beam {
        public:
        int length;
        };
    
        int main () 
        {
           int i=0, no_of_spans, j;
           cout<< "Design Of a Continous Beam \n1) No Of Spans : ";
           cin >> no_of_spans;
           for (i =0; i < no_of_spans; i++) {
             j = i;
             beam;
             cout << "Length of Beam" << j+1 << " is : ";
             cin >> beami.length;
           }
    
           cout << "\nPress any key to continue..\n";
           getch ();
        }
    

これは明らかにエラーのあるコードであり、アイデアを得るための例として挙げられています。

4

5 に答える 5

2

他の人 (Luchian、John、Component、および Ed) によって既に述べられているように、必要なオブジェクトstd::vectorの数を格納するために必要に応じて動的に拡張されます。beam

後でこれらのオブジェクトを名前で参照したい場合std::mapは、マップのキーをオブジェクト名として に保存できます (例: beam1、beam2、beam3、...、beamX):

std::map<std::string, beam> beams;
for (int i = 0; i < no_of_spans; i++)
{
    j = i;
    beam beam;
    std::string beam_name("beam" + boost::lexical_cast<std::string>(i + 1));
    cout << "Length of " << beam_name << " is : ";
    cin >> beam.length;
    beams.insert(std::make_pair(beam_name, beam));
}

--

boost::lexical_cast<>(この場合) を に変換するメカニズムintですstd::string。これを達成する他の方法があります(std::ostringstream例を使用)。

于 2012-05-17T13:13:52.417 に答える
1

を使用しstd::vectorてオブジェクトを格納できます。

push_backに要素を追加するために使用しvectorます。

次のようなもの:

std::vector<beams> beamCollection;
for (i =0; i < no_of_spans; i++) {
    j = i;
    beam beami;
    cout << "Length of Beam" << j+1 << " is : ";
    cin >> beami.length;
    beamCollection.push_back(beami);
}
于 2012-05-17T13:03:40.703 に答える
1

はい、もちろん可能です。いくつかの方法があります。

1つの方法、可能/実用的であれば私が好む方法は、std::vectorand push_backtransformまたはgenerate_n必要なオブジェクトの数を使用することです。

別の方法は、必要なnewオブジェクトの配列を割り当てるために使用することです。vectorただし、これは a を使用するよりも好ましくありません。使用すると、メモリを管理する責任が生じるためです。すべての に対応するnewa が必要です。これは、 などのスマート ポインターを使用することで軽減できますが、サボテンを完全に回避することをお勧めします。deletenewstd::unique_ptr

于 2012-05-17T13:06:46.203 に答える
0

はい、可能です。あなたの最善の策は、適切な STL コレクションを使用し、オブジェクトを追加/削除して実行時に動的に拡張することです。

于 2012-05-17T13:04:06.550 に答える
0

いいえ、短い答えです。コンパイラは、コンパイル時に変数の名前を知る必要があります。

配列 (またはベクトル) を使用する必要があります。

于 2012-05-17T13:04:48.077 に答える