数组作为数据成员

时间:2015-03-10 01:06:51

标签: c++

我希望有一个包含数组的类作为它的数据成员。阵列的大小在构造期间声明。我知道数组的大小需要在编译时知道,但是没有办法通过使用const int来定义大小并随后使用构造函数初始化列表来解决这个问题吗?我不允许使用矢量。这是我徒劳的尝试:

#include <iostream>

using namespace std;

class myArray {
    public:
        myArray(int size) : capacity(size) {}
    private:
        const int capacity;
        int a[capacity];
};

int main() {
    myArray ar(25); 
    return 0;     
}

它给出以下错误: 'capacity' was not declared in this scope

6 个答案:

答案 0 :(得分:2)

尝试使用指针

#include <iostream>
using namespace std;
class myArray {
public:
    myArray(int size) : capacity(size) {array = new int[capacity];}
    ~myArray() {delete [] array;}

private:
    const int capacity;
    int* array;
};

int main() {
    myArray ar(25); 
    return 0;     
}

不要忘记在析构函数中释放。

答案 1 :(得分:1)

它可以使用静态const,但是你会丢失构造函数参数设置。您必须动态分配它才能工作:

class myArray {
    public:
        myArray(int size) : capacity(size) 
        {
            a = malloc(size * sizeof(int));
        }
        ~myArray() { free(a); }
    private:
        int capacity;
        int* a;
};

int main() {
    myArray ar(25); 
    return 0;     
}

尽管使用new []分配并使用delete []释放可能比malloc和free更多的是C ++。

如某些评论中所述,如果您动态分配并且不使用shared_ptrunique_ptr等自动资源管理对象,则必须遵循rule of three。< /强>

答案 2 :(得分:1)

原始类的问题在于允许将不同的值作为容量传入。因此,您无法以您希望的方式创建具有该值的数组。没有区别你只是创建一个大小为25的实例,程序的属性,而且这个类本身并不知道它只是用那种方式。


现在我不会质疑为什么你不能使用向量,但是不使用语言/库的全部功能似乎很遗憾。

但是,根据您的限制,您可以动态创建数组,而不是尝试创建固定数组:

#include <iostream>

using namespace std;

class myArray {
    public:
        myArray(int size) : capacity(size) {
            a = new int[capacity];
        }
        ~myArray() {
            delete[] a;
        }
        // Also need all those other things, mandated by the
        // rule of 3/5, to allow proper deep copy/move:
        // - copy constructor.
        // - copy assignment operator.
        // - move constructor (C++11).
        // - move assignment operator (C++11).

    private:
        const int capacity;
        int *a;
};

int main() {
    myArray ar1(25);
    myArray ar1(42);
    return 0;
}

答案 3 :(得分:1)

以上所有答案都“技术上正确”,但没有一个真正显示智能指针的使用,这使得所有额外的内存管理都不必要。

class my_array
{
public:
   my_array (size_t sz)
     : arr {new int [sz]} {}

pirvate:
   std::unique_ptr <int[]> arr;
};

现在你不必关心(3或5)的规则,代码是正确的,并且(大部分)是异常安全的。

答案 4 :(得分:0)

通过传入capacity作为变量,您有一个动态大小的数组(其大小仅在运行时已知)。这意味着编译器不知道sizeof(myArray),这将导致问题。

相反,您需要存储指向数组的指针。

另一个(丑陋的)方法是使用放置策略,将数组放在struct / class的末尾,并给它一个常量大小为1,如图here所示

答案 5 :(得分:0)

const不足,因为您甚至可以在执行程序期间获取用户提供的值并将其设为const

int x;
std::cin >> x;
const int y = x;

这是不够的,因为在编译程序时必须知道的数组维度

从历史上看,如果您要初始化static const&#34;变量&#34;在声明时,这足以说服编译器它可以将该值用于数组维度:

static const unsigned int N = 5;

因为没有办法可以出错。

如今,我们constexpr的目的是为了明确这一点。