【问题标题】:How to pass value to the object constructor's declare using dynamic memory allocation如何使用动态内存分配将值传递给对象构造函数的声明
【发布时间】:2012-08-14 15:02:23
【问题描述】:

代码如下:

代码:

#include <iostream>

using namespace std;

class pub
{
    string name;

    public:
    pub(string name):name(name){}    //Constructor
    void getName(string name){this->name = name;}
    string returnName(void){return name;}
};

int main(void)
{
    pub * p = new pub[5]; //Error-prone statement.

                          //Ignore for not having "delete" statement

    return 0;
}

问题:

1.) 在这种情况下,我有什么方法可以将值传递给我分配的每个动态内存,还是我必须为构造函数的参数设置一个默认值才能规避这个问题?

谢谢!

【问题讨论】:

标签: c++ object pointers dynamic constructor-overloading


【解决方案1】:

如果您的编译器支持 C++11,您可以使用 std::vector 和初始化列表:

std::vector<pub> v { pub("1"), pub("2") };

查看在线演示https://ideone.com/Qp4uo

std::array:

std::array<pub, 2> v = { { pub("1"), pub("2") } };

查看在线演示https://ideone.com/lBXUS

这两种方法都可以消除delete[]动态分配数组的负担。

【讨论】:

    【解决方案2】:

    除了您使用的有点不合常规的命名约定(我将getName() 更改为setName()returnName() 更改为getName(),并使用尾随_ 来表示私有数据成员),使用`std: :vector 会自动为你做内存管理:

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class pub
    {
    public:
        pub(): name_("default") {}
        pub(string const& name): name_(name){}    //Constructor
        pub(const char* name): name_(name) {}
        void setName(string const& name){ name_ = name;}
        string getName(void) const {return name_;}
    
    private:
        string name_;
    };
    
    int main(void)
    {
        // initialize with 2 elements, then add 3 more default elements
        std::vector<pub> pub_vec { "bla", "bar" };
        pub_vec.resize(5);
    
        std::for_each(pub_vec.begin(), pub_vec.end(), [](pub const& elem){
            std::cout << elem.getName() << "\n";
        });
    
        return 0;
    }   // 5 destructors automatically called
    

    注意:添加采用const char* 的重载构造函数允许您使用字符串文字来初始化数据。

    Ideone 上的输出

    【讨论】:

    • 你能否将pub_vec 设为5 long 但只提供两个默认值(即允许默认构造最后三个)?
    • @LokiAstari 如果您为pub 添加一个默认构造函数(将名称设置为“默认”或其他),那么只需在初始化后执行pub_vec.resize(5) 即可。
    • 我想知道pub_vec(5) = { "bla", "bar" /* Implicit default construct 3 items */ }; 是否可行。
    • @LokiAstari 不,该语法不会编译。最接近编译的是std::vector&lt;pub&gt; pub_vec(5); pub_vec = { "bla", "bar" };,但最终的元素会被截断。我认为单个 pub_vec.resize(5) 已经足够好,因为它可以很好地扩展更大的尾随默认字符串。
    【解决方案3】:

    使用std::vector&lt;pub&gt;。它不需要默认构造函数。

    例如

    std::vector<pub> vec(5, pub("xyz"));
    

    创建一个包含 5 个相等元素的向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2010-11-17
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多