使用没有默认构造函数的类/类型初始化自定义容器

时间:2018-03-20 02:34:16

标签: c++ constructor containers

如何将容器初始化为没有默认值的类?如何在不使用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调用中作为第二个参数给出的值。

1 个答案:

答案 0 :(得分:1)

您可以使用展示位置string ety ="http://audio.oxforddictionaries.com/en/mp3/ranker_gb_1_8.mp3"; myaudio.Src = ety; 。放置new允许您在特定的内存位置构建对象,因此步骤如下所示:

  1. 分配原始内存(newmalloc都有效)
  2. 在此原始内存(::operator new
  3. 中构建您的对象

    这大致是常规new (ptr) NoDefault{args}的工作方式(通过new分配内存,然后使用展示位置::operator new构建对象)。我不确定像new这样的标准容器是否需要使用此方法,但如果他们没有这样做,我会感到有些惊讶。

    最大的警告(它是一个很大的问题)是当使用放置vector时,你必须手动调用析构函数(我唯一知道你故意调用析构函数的地方)。调用析构函数后,您可以使用适当的方法释放分配的内存(例如,newfree)。

    可从C++ FAQ获取更多信息。