在嵌套类中声明固定长度的数组

时间:2014-05-06 13:36:29

标签: c++ arrays c++11 enums nested-class

我有一个类A,它有一个嵌套类B.类A,将创建类B的n(运行时参数)实例。

在A的构造函数中,在需要在运行时进行的计算之后,我计算一个大小,比方说s。

现在,每个B类都将保留一个大小为s的数组。

但是,我不允许使用.cpp文件,所有工作都必须在头文件中完成。

据我了解,这意味着我无法使用这些方法(使用static):

class B {

static const int s;
int a[s];

};

所以,我决定使用enum,但我无法使其工作(即使使用C ++ 11的enum class)。 这个想法是你做的事情:

class B {

enum { s = 50 };
int a[s];

};

但我在运行时之前不知道s

当然,我可以使用std::vectordynamic allocation

但是从那以后:

1)我只需要旧的好数组(丢弃向量)的功能

2)我知道在构造B的实例之前,数组的大小(丢弃动态分配)

关于下面讨论的std::dynarray

不幸的是,不是C++14,而是array TSC++17Source,归功于manlio。

丢弃是一个沉重的词。我的意思是,我听说自动分配更快,但动态分配可以让您分配更多空间。而且,在发布模式下,与数组相比,矢量并没有那么糟糕。

4 个答案:

答案 0 :(得分:1)

有两个问题。首先,注意类的嵌套仅适用于范围。嵌套类不会在外部类中自动创建该类的数据成员。因此,通常您将在外部类中定义嵌套类类型的成员,如下所示。其次,您无法根据在C ++中运行时计算的大小来定义数组。

也就是说,您可以轻松使用std::vector。如果由于某种原因必须在头文件中完成所有操作,你可以在课堂上定义它们,但如果它们超过几行则不是一个好主意。

#include <vector>
#include <cstddef>

class A {
    private:
        class B {
            friend A;
            B(size_t n) : array(n) {}
            std::vector<int> array;
        };
    public:
        // Initialize b_member based on some computation.
        A(int i) : b_member(i + 2), b_ptr_member(new B(i + 3)) {}
        ~A() { delete b_ptr_member; }
    private:
        B b_member;
        B *b_ptr_member;
};

int main() {
    A a(10);
}

答案 1 :(得分:1)

您无法在C ++中声明可变大小的数组。编译器必须事先知道数组的大小。请改用std::vector,然后使用std::vector::shrink_to_fit来降低其容量以适应其大小。:

class B {
  ...
  std::vector<int> a;
  ...
};

答案 2 :(得分:1)

具有相同元素类型但具有不同大小的两个阵列是不同类型。例如,char[10]char[11]是不同的类型。同样的方法如果两个类的成员的类型在这两个类之间不同,那么这些类定义了不同的类型并且具有不同的大小(我的意思是操作符sizeof)。此外,您可能无法实例化不完整类型的对象。

如果您的编译器支持类std::dynarray,我建议使用它。否则,您可以使用课程std::vector

答案 3 :(得分:1)

答案是:使用std::vector。这个项目:

  

1)我只需要旧的好数组的功能(丢弃   矢量)

并不真正适用。你需要旧的好数组没有的额外功能(即分配一个你在运行时只有大小的数组)。

如果你有一个最近的编译器/标准库,也许你可以访问<experimental/dynarray> ...其中,恕我直言,只是<vector>的残缺版本,但每个都是自己的:D