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

时间:2012-02-28 14:06:05

标签: c++ arrays class size

如何将数组定义为类的成员,同时将其大小确定在其他位置,实际上将其传递给构造函数。

更多细节: 有一个整数数组,并在类中定义了一个公共成员。

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

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

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

做这种事的正确语法是什么?

5 个答案:

答案 0 :(得分:3)

执行此操作的正确方法是使用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);
        }
};

有关载体的更多信息,请here。进一步的建议:

  • 如果没有令人信服的理由,请不要公开您的实例变量。
  • 名称实例变量以某种方式特殊(例如通过附加_)。
  • 很多人不喜欢名为全小写的类。

答案 1 :(得分:3)

您的课程似乎正在尝试定义“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问题"What is the Rule of Three?"涵盖了这一点。)

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

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

您无需明确存储大小;矢量为你做到了。

答案 2 :(得分:1)

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

int **arr;

并在ctor中初始化为..

*arr = new int*[s];

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

答案 3 :(得分:1)

也许这不是你想要的,但我会用模板参数

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

您将此类实例化为

Foo<1024> * f = new Foo<1024> ();

答案 4 :(得分:0)

class foo {
   public:
     std::vector m_vec;
     foo(uint32_t size) : m_vec(size) { }
};