用户定义的类的构造函数不使用向量

时间:2017-06-13 21:03:32

标签: c++ class vector constructor

我的问题非常简单,类的构造函数不能使用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? 如果您需要任何进一步的细节,我很乐意提供。

3 个答案:

答案 0 :(得分:2)

在第二种情况下,您正在构建一个对象并在向量中复制它。如果你想直接在向量中构造,我建议使用不带参数的namespace MainForm { public delegate void MyDel(string str); public partial class Form1 : Form { public event MyDel MyEvent; public Form1() { InitializeComponent(); MyEvent += new MyDel(WriteSomething); Crosscutting.DoSomething(); } public void WriteSomething(string message) { Console.WriteLine(message); } } //Crosscutting.cs public class Crosscutting { private static void WriteLogEntry(string message) { // Code to write message to log file. } public static void DoSomething() { WriteSomething obj = new WriteSomething(); // Code to do something. WriteLogEntry("I'm doing something"); } } }

emplace_back

答案 1 :(得分:1)

您需要设置矢量的初始大小,例如按std::vector <my_class> 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

答案 2 :(得分:0)

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

另外,检测你的复制构造函数并移动构造函数。