如何将容器初始化为没有默认值的类?如何在不使用new或调用类的默认构造函数的方法的情况下创建所需的指针数组?
#include <string>
#include <iostream>
#include <vector>
#include "MyVector.h"
class NoDefault {
public:
//NoDefault():value(0){};
NoDefault(const int& value) : value(value) {}
int value;
};
std::ostream& operator<<(std::ostream& out, const NoDefault& noDefault) {
out << noDefault.value;
return out;
}
int main() {
MyVector<int> intVec(10, 99);
MyVector<std::string> stringVec(5, "hi");
MyVector<NoDefault> noDefaultVec(4, -3);
std::vector<std::vector<std::string>> tempRealVec({{"hi", "bye"}, {"sly",
"guy", "why"}});
MyVector<MyVector<std::string> > tempMyVec(tempRealVec);
MyVector<MyVector<MyVector<std::string> > > vecVecVecStringVec(2, tempMyVec);
std::cout << "intVec = " << intVec << std::endl;
std::cout << "stringVec = " << stringVec << std::endl;
std::cout << "noDefaultVec = " << noDefaultVec << std::endl;
std::cout << "vecVecVecStringVec = " << vecVecVecStringVec << std::endl;
std::cout << "hello" << std::endl;
return 0;
}
这是构造函数
template <typename T>
MyVector<T>::MyVector(const unsigned int& numElements,const T& value):data_(new
T[numElements]),size_(numElements)
{
for(int i = 0; i < size_; i++)
{
if(std::is_same<T,int>::value)
data_[i]=T(value);
else if(std::is_same<T,std::string>::value)
data_[i]=T(value);
else if(std::is_same<T,MyVector>::value)
data_[i]=T(value);
else if(std::is_same<T,NoDefault>::value)
data_[i]=T(value);
}
}
由于在初始化程序列表中使用new而抛出的错误是没有匹配函数来调用NoDefault :: NoDefault(),即使我创建了那个构造函数,这也会破坏目的。然后它会使用默认值打印向量,而不是在MyVector调用中作为第二个参数给出的值。
答案 0 :(得分:1)
您可以使用展示位置string ety ="http://audio.oxforddictionaries.com/en/mp3/ranker_gb_1_8.mp3";
myaudio.Src = ety;
。放置new
允许您在特定的内存位置构建对象,因此步骤如下所示:
new
或malloc
都有效)::operator new
)这大致是常规new (ptr) NoDefault{args}
的工作方式(通过new
分配内存,然后使用展示位置::operator new
构建对象)。我不确定像new
这样的标准容器是否需要使用此方法,但如果他们没有这样做,我会感到有些惊讶。
最大的警告(它是一个很大的问题)是当使用放置vector
时,你必须手动调用析构函数(我唯一知道你故意调用析构函数的地方)。调用析构函数后,您可以使用适当的方法释放分配的内存(例如,new
或free
)。
可从C++ FAQ获取更多信息。