动态对象创建

时间:2012-05-17 13:01:10

标签: c++

我是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 ();
        }
    
  3. 这显然是一个有错误的代码,它是作为一个例子来提出想法。

5 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:1)

您可以使用std::vector来存储对象。

您使用push_backvector添加元素。

有些事情:

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);
}

答案 2 :(得分:1)

是的,当然有可能。有几种方法。

一种方式,就我可能/实际使用的方式而言,是使用std::vectorpush_backtransformgenerate_n您需要多少对象。

另一种方法是使用new来分配所需对象的数组。然而,这不是首选使用vector,因为使用new承担管理内存的责任 - 需要有delete对应每个new }}。这可以通过使用诸如std::unique_ptr之类的智能指针来缓解,但通常最好完全避免使用仙人掌。

答案 3 :(得分:0)

是的,有可能。最好的办法是使用适当的STL集合,并通过添加/删除对象在运行时动态增长它。

答案 4 :(得分:0)

简短回答否 - 编译器需要在编译时知道变量的名称。

您需要使用数组(或矢量)。