2

假设我有一个名为的基类

Class Base {
public:
    std::string array[];
};

字符串数组的大小直到另一个类扩展它才决定,这样做的正确语法是什么?

EG,稍后在派生类中

Derived::Derived() {
    array[] = new array[40];
}
4

6 回答 6

8

如果你想使用 C 风格的数组,大小必须是固定的,并且在编译时是已知的。即使在这种情况下,您也可以改用更安全、零开销的std::array<>包装器。

如果在编译时不知道容器的大小,那么最好使用std::vector(或者std::deque在某些情况下,根据您在内存分配方面的要求)并避免通过原始指针进行手动内存管理,new[]并且delete[]

#include <string> // For std::string
#include <vector> // For std::vector

class Base {
public:
    std::vector<std::string> myVector;
};

此外,这种设计不需要在Derived. 如果 的默认构造函数所做的Derived只是分配数组,那么现在您可以完全避免显式定义默认构造函数,并让编译器为您隐式生成一个 - 析构函数也是如此。

另外,我不鼓励您使用标准容器类的名称(如array)作为变量的名称。类似myArray(或myVector,如我上面的示例)是更合适的选择。

于 2013-04-01T13:10:55.233 回答
5

你没有。C++ 中的数组具有编译时固定大小。你不能只是根据自己的喜好调整它们的大小。

仅使用语言功能来做到这一点的糟糕方法是让您的成员成为std::string*

std::string* array;

然后动态分配一个s数组std::string,将指向第一个元素的指针分配给array

Derived::Derived() {
    array = new std::string[40];
}

做到这一点的好方法是使用库功能。标准库提供容器类型供您使用。尝试std::vector<std::string>

std::vector<std::string> array;

您可以将其初始化为包含 40 个字符串,如下所示:

Derived::Derived()
  : array(40)
{ }
于 2013-04-01T13:12:08.987 回答
3

为什么不使用 astd::vector<std::string>这样您就不必担心尺寸了。容器在插入新东西时自动调整大小。

于 2013-04-01T13:11:27.813 回答
3

使用字符串向量通常是更好的解决方案。

但这会起作用:

Class Base {
Public:
    std::string *array;
};
Derived::Derived() {
    array = new array[40];
}

我要补充:

Class Base {
Public:
    std::string *arr;
    Base():arr(nullptr){}
    Base(sizr_t s):arr(new std::string[s]){}
    ~Base(){delete []arr;}
};
Derived::Derived():Base(40) {  }

您可能需要编写复制/移动构造函数和赋值。派生不必了解太多。现在比较:

Class Base {
Public:
    std::vector<std::string> arr;
    Base(){}
    Base(sizr_t s):arr(s){}
};

所有其他特殊函数:析构函数、复制/移动构造函数和赋值由编译器生成。Derived 的构造函数仍然是: Derived::Derived():Base(40) { } 另外...您可能希望将 arr 设为私有或至少受保护?

于 2013-04-01T13:11:29.920 回答
1

正确的语法是

std::vector<std::string> array;
于 2013-04-01T13:11:34.860 回答
0

除了完成到死堆分配之外,您还可以静态调整它的大小,如下所示:

template <int N>
class Base
{
  public:
    std::string array[N];
};

class Derived : Base<40>
{ ... }

优点:简单,避免(相对较慢)运行时的内存分配和清理的麻烦(智能数组指针或其他)。缺点: Base 的每个实例化都是不同的类型,这可能会导致更多的膨胀和更少的互操作性。

于 2013-04-01T13:19:52.557 回答