我有一个类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::vector
或dynamic allocation
。
但是从那以后:
1)我只需要旧的好数组(丢弃向量)的功能
2)我知道在构造B的实例之前,数组的大小(丢弃动态分配)
关于下面讨论的std::dynarray
:
不幸的是,不是C++14
,而是array TS
或C++17
。
Source,归功于manlio。
丢弃是一个沉重的词。我的意思是,我听说自动分配更快,但动态分配可以让您分配更多空间。而且,在发布模式下,与数组相比,矢量并没有那么糟糕。
答案 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