C++: dynamically allocating a member array of structs using non-default constructor

后端 未结 4 1026
暖寄归人
暖寄归人 2020-12-10 15:33

If I have:

struct a_struct
{
    int an_int;

    a_struct(int f) : an_int(f) {}
    a_struct() : an_int(0) {}
};

class a_class
{
    a_struct * my_structs;         


        
相关标签:
4条回答
  • 2020-12-10 16:09

    If using the STL is an option, you could use std::vector instead of a dynamic array.

    I think that this will work:

    std::vector<a_struct> my_structs;
    
    my_structs.assign(10, 1);
    

    If not, this should:

    my_structs.assign(10, a_struct(1));
    
    0 讨论(0)
  • 2020-12-10 16:22

    You can't do it directly on any particular parameterized constructor. However you can do,

    a_struct *my_struct[10] = {}; // create an array of pointers
    
    for (int i = 0; i < 10; i++)
        my_struct[i] = new a_struct(i); // allocate using non-default constructor
    

    When you're going to de-allocate the memory,

    for (int i = 0; i < 10; i++)
        delete my_struct[i]  // de-allocate memory
    

    I suggest using a std::vector container instead of going through this process.

    0 讨论(0)
  • 2020-12-10 16:23

    You could use an array of pointers to pointers. Then you can create the array that will hold pointers to a_struct(), so you can decide later which constructor to use:

    class a_class {
        a_struct ** my_structs;
    
        a_class() { my_structs = new a_struct* [10]}
        void foo () {
           my_structs[0] = new a_struct(1);
           my_structs[5] = new a_struct("some string and float constructor", 3.14);
        }
    }; 
    
    0 讨论(0)
  • 2020-12-10 16:24

    You could allocate a raw chunk of memory and use placement new to initialize each struct:

    int number_of_structs = 10;
    my_structs = (a_struct*)new unsigned char[sizeof(a_struct) * number_of_structs];
         // allocate a raw chunk of memory 
    a_struct* p = m_structs;
    for (int i=0; i<number_of_structs; i++)
    {
        new (p) a_struct(i);
        p++;
    }
    

    See also: What uses are there for "placement new"?

    0 讨论(0)
提交回复
热议问题