【问题标题】:Member variable of type std::array<T, ?>std::array<T, ?> 类型的成员变量
【发布时间】:2012-12-05 19:19:17
【问题描述】:

如何为 std::array&lt;T, ?&gt; 类型的模板类 AClass 声明和设置成员变量(未定义大小)?实际的std::array是在构造函数中创建的,其中数组的大小是构造函数的参数。

在伪 C++ 代码中:

template <typename T> class AClass {

protected:
    std::array<T, ?>* array;

public:

    AClass(int n) {
        this->array = new std::array<T, n>;
    }

}

正确的代码是什么样的?

【问题讨论】:

  • new 是干什么用的?
  • 这完全不是std::array 的用途,你不能像这样将参数传递给模板。
  • @R.MartinhoFernandes 告诉我为什么这里是错误的(忽略这是不可能的,因为std::array 的大小必须是编译时常量)。
  • @cls: #1 它不能编译,因为成员不是指针; #2 它会泄漏资源,因为它放弃了编译器保证的析构函数调用。
  • AClass(int n) : array() {} 可以正常工作(忽略大小必须在编译时可用的事实),或者 AClass(int n) : array(n) {} 用于向量成员。一般来说,您可以使用T() 创建T 类型的对象;不涉及new,这不是Java。

标签: c++ arrays oop


【解决方案1】:

不要为此使用std::array,请使用std::vectorstd::array 的大小必须是编译时常量。如果要在构造函数中传递,则需要使用std::vector

【讨论】:

  • std::unique_ptr&lt;T[]&gt; array,如果不需要调整大小和其他vector 功能。
  • 嗯,我不确定这是否有任何好处。语法肯定更复杂,我怀疑它是否明显更快或更节省内存。
  • 我不认为它会更快,但它的内存开销确实比vector 略少。正如我所说,如果不需要调整大小,可能值得考虑,否则使用vector
  • @Praetorian 什么开销少一点?如果有的话,unique_ptr&lt;T[]&gt; 有底层,因为它不知道它的大小。
  • @R.MartinhoFernandes 我不也是这么说的吗?与vector 相比,unique_ptr&lt;T[]&gt; 的内存开销更少?
【解决方案2】:

实际的std::array要在构造函数中创建,其中数组的大小是构造函数的参数。

std::array 的大小必须在编译时知道,在你的情况下它不是。

您必须为此使用std::vector

【讨论】:

    【解决方案3】:

    与在运行时真正定义大小的std::vector 分开,您还可以选择在编译时指定大小(例如,根据您的问题设置为最大可能值)并将模板参数“传播”给客户端你的班级,即

    template <typename T, std::size_t n> 
    class AClass {
       protected:
           std::array<T, n> array;
       public:
           AClass() {
               // nothing to do
           }
    }
    

    然后你像这样使用它:

    AClass<int, 5> myAClass;
    

    【讨论】:

    • 是的,但是对于数组的大小作为构造函数参数有一个明确的要求。在这里,它不是,也不可能。
    • 取决于 OP 的真正要求,有时 OP 会引入不必要的要求,实际上在编译时大小是已知的。
    【解决方案4】:

    您不能拥有未定义大小的std::array
    请改用std::unique_ptr&lt;T[]&gt;std::vector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多