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)已经说过的那样,您可以使用 astd::vector并且它会根据需要动态增长以存储所需的beam对象数量。

如果您希望稍后通过名称引用这些对象,您可以将它们存储在 astd::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<>是一种将(在这种情况下)转换为 a 的int机制std::string。还有其他方法可以实现这一点(std::ostringstream例如使用)。

于 2012-05-17T13:13:52.417 回答
1

您可以使用 astd::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

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

一种方法,如果可能/实用的话,我更喜欢的方法是使用std::vectorand push_backtransform或者generate_n你需要多少个对象。

另一种方法是使用new一个数组来分配你想要的对象。但是,这比使用 a 不太可取vector,因为通过使用,new您承担了管理内存的责任——需要有一个delete对应于每个new. 这可以通过使用诸如 的智能指针来缓解std::unique_ptr,但通常最好完全避免使用仙人掌。

于 2012-05-17T13:06:46.203 回答
0

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

于 2012-05-17T13:04:06.550 回答
0

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

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

于 2012-05-17T13:04:48.077 回答