我的问题非常简单,类的构造函数不能使用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
?
如果您需要任何进一步的细节,我很乐意提供。
答案 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)
构造一个空向量。为什么在这种情况下你会期望调用你的构造函数?在实际将一些对象放入向量中之前,它不会被调用。
另外,检测你的复制构造函数并移动构造函数。