【问题标题】:Constructor of user-defined class not working with vector用户定义类的构造函数不使用向量
【发布时间】:2017-11-15 19:47:47
【问题描述】:

我的问题很简单,类的构造函数不能使用std::vector

class my_class
{
public:
    my_class() { std::cout << "my_class constructed\n"; }
};

int main()
{
    std::vector <my_class> v;
}

程序没有输出任何东西,尽管它应该输出my_class constructed。然后我假设构造函数适用于vector 的每个元素,所以我这样做了:

class my_class
{
public:
    my_class() { std::cout << "my_class constructed"; }
};

int main()
{
    my_class object;
    std::vector <my_class> v;
    v.push_back( object );
}

此代码输出:

my_class constructed 

这个构造发生是因为my_class 对象,而不是因为使用push_back()

如何使构造函数为std::vector 工作? 如果您需要任何进一步的细节,我很乐意提供。

【问题讨论】:

  • 提示:也检测复制构造函数。
  • 神圣的三位一体,或者如果那不是你的东西 - 三法则。
  • @DeiDei 或5的规则。
  • 提示:第一个,检查v.size()。对于第二个,请尝试v.emplace_back()

标签: c++ class vector constructor


【解决方案1】:

在第二种情况下,您正在构造一个对象并在向量中复制构造它。如果你想直接在向量内部构造,我建议使用emplace_back 不带参数:

v.emplace_back();

【讨论】:

  • 如果您想直接实际构建它而不是从临时移动,请使用对 emplace_back() 的调用,不带参数。
【解决方案2】:

您需要设置向量的初始大小,例如通过std::vector &lt;my_class&gt; v(10)。 然后它实际上应该调用构造函数 10 次,因为向量的元素被默认初始化。

在您的第二个示例中,当您 push_back 一个对象时,该对象可能被复制而不是“构造”。如果你实现了一个复制构造函数,你可以观察到这种行为:

class my_class
{
public:

    my_class();
    my_class(const my_class &m) { cout << "copy constructor called" << endl; };
};
my_class::my_class()
{
    std::cout << "my_class constructed\n";
}

int main()
{
    my_class mc;

    std::vector <my_class> v;

    v.push_back(mc);
    return 0;
}

输出:

my_class constructed
copy constructor called

【讨论】:

  • 所以使用push_back()时不调用构造函数?
  • 不一定;可以复制或移动对象,然后调用复制或移动构造函数;这就是@DeiDei 提到三法则的原因。
  • @stance changer:查看改编代码以说明上述内容。
【解决方案3】:

你构造了一个空向量。为什么你希望你的构造函数在这种情况下被调用?在您实际将一些对象放入向量中之前,它不会被调用。

另外,检测您的复制构造函数和移动构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2014-08-12
    • 2015-03-23
    • 2012-10-17
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多