繁体   English   中英

在类中定义数组,但大小由构造函数确定

[英]Defining an array in a class but the size is determined in the constructor

我如何将数组定义为类的成员,而数组的大小在其他地方确定,并实际上将其传递给构造函数。

更多详细信息:有一个整数数组,并在类中定义为公共成员。

class foo {
  public:
    int *arr[];
    int s;
};

但是,数组的大小在构造函数中传递。

foo::foo()
        : s (array_size)
{
}

这样做的正确语法是什么?

正确的方法是将STL和std::vector< int >用于此类任务。 以下是可能适合您的粗略概述:

#include <vector>

...

class foo
{
    public:
        std::vector< int > arr_;

        ...

        foo(const int* numbers, int numberCount)
        : arr_(numbers, numbers+numberCount)
        {
        }

        ...

        int size() const
        {
            return arr_.size();
        }

        ...

        int& operator [] (int index)
        {
           return arr_.at(index);
        }
};

有关向量的更多信息,请参见此处 进一步建议:

  • 如果没有令人信服的理由,请勿将您的实例变量公开。
  • 名称实例变量有些特殊(例如,通过附加_ )。
  • 许多人不喜欢被全部命名为小写的类。

您的班级似乎正在尝试定义“指向int的指针”的数组,而不是您建议的int数组。 然而,经典的答案恰恰是您使用了一个“指向int的指针”,并在构造函数中分配了数组,然后在析构函数中释放了它。 初步近似:

class foo
{
public:
    int *arr;
    int  s;
    foo(int sz) : s(sz) { arr = new int [s]; }
   ~foo()               { delete [] arr; }
};

如果您打算沿这条路线走,还需要提供一个赋值运算符和一个副本构造函数(正如Mike Seymour提醒我的那样-谢谢Mike); 如果您不自己编写,编译器将为您编写的默认版本将是错误的-极其错误。 (SO问题“三个规则是什么?”涵盖了这一点。)

但是,这(可能)不是异常安全的,因此建议您使用std::vector<int>代替普通指针:

class foo
{
public:
    std::vector<int> arr;
    foo(int sz) : arr(sz) { }
};

您无需显式存储大小; 向量为您做到了。

首先,不知道为什么要使用int指针数组,但我是谁来质疑您的设计呢。任何人,都可以使用指针和动态分配来做到这一点。 将数组声明为...

int **arr;

并在ctor中将其初始化为

*arr = new int*[s];

请记住使用delete[]在dtor上清理它。 另一种选择是使用std::vector<int*>

也许这并不是您想要的,但是我可以使用模板参数来实现

template<int T>
class Foo
{
    public:
    int array[T];
    int s;
};

您可以像这样实例化此类

Foo<1024> * f = new Foo<1024> ();
class foo {
   public:
     std::vector m_vec;
     foo(uint32_t size) : m_vec(size) { }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM