【问题标题】:C++ initializing template classC++初始化模板类
【发布时间】:2013-01-01 20:51:33
【问题描述】:

我对创建模板类时发生的事情感到有些困惑。我试图在构造过程中将成员 vector_ 的容量设置为 50(仅一次),但似乎容量从未正确设置,所以显然我不明白应该如何做到这一点。我已经包含了相关的 sn-ps 代码,以及控制台输出。感谢您的帮助!

向量的模板类:

template <typename T>
class V
{
  public:
    V()
    {
      std::cout << "capacity 1 = " << this->vector_.capacity() << "\n";
    };
    V(int capacity)
    {
      this->vector_.reserve(capacity);
      std::cout << "capacity 2 = " << this->vector_.capacity() << "\n";
    };
    int capacity() const { return this->vector_.capacity(); };
  private:
    std::vector<T> vector_;
};

初始化R的构造函数:

R::R()
{
  std::cout << "capacity 0 = " << this->s_.capacity() << "\n";
  this->s_ = V< std::vector< std::complex<float> > >(50);
  std::cout << "capacity 3 = " << this->s_.capacity() << "\n";
};

R类的头文件:

class R
{
  public:
    R();
  private:
    V< std::vector< std::complex<float> > > s_;
};

输出到控制台:

capacity 1 = 0
capacity 0 = 0
capacity 2 = 50
capacity 3 = 0

【问题讨论】:

  • 可能缺少 copy-constructor 吗?生成该输出的代码是什么?
  • 如何编译? s_V 类型,它没有capacity 方法...
  • 另外,让 V() 返回一些东西,比如对 classes 向量的引用,这可能就是为什么你在 R 的构造函数中的最后一行让你感到困惑。

标签: c++ templates vector


【解决方案1】:

您没有设置std::vector&lt;T&gt; 的大小,而是设置它的容量。容量不是std::vector&lt;T&gt; 的显着属性,因此不会被复制。你需要使用resize()来设置大小。

【讨论】:

  • 我将如何正确设置容量,因为我似乎必须使用复制构造函数?还是有另一种使用单个构造函数的方法,因为我只想实例化一次,但是在 R 的构造函数中......
  • @wrapperapps:您需要提供一个复制构造函数(如果您分配对象,还需要一个复制分配)来复制capacity()。请注意,即使设置了非零容量,向量的大小也将保持不变,即它是空的,但会分配内存
  • 谢谢,我通过添加:V& operator=(V const& copy) { this->vector_ = copy.vector_; this->vector_.reserve(copy.vector_.capacity());返回*这个; };
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2021-10-21
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多