我如何在以后实例化数组的大小?

时间:2013-04-01 13:09:04

标签: c++

假设我有一个名为

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

在另一个类扩展之前,字符串数组的大小是不确定的,这样做的正确语法是什么?

EG,稍后在派生类

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

6 个答案:

答案 0 :(得分:7)

如果要使用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的默认构造函数完成的所有事情都是分配数组,那么现在你可以避免显式地定义一个默认的构造函数,让编译器隐式地为你生成一个 - 析构函数的故事。 / p>

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

答案 1 :(得分:5)

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

仅使用语言功能执行此操作的不好方法是将您的成员实际视为std::string*

std::string* array;

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

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

执行此操作的好方法是使用库功能。标准库提供了您可以使用的容器类型。试试std::vector<std::string>

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

你可以初始化包含40个字符串,如下所示:

Derived::Derived()
  : array(40)
{ }

答案 2 :(得分:3)

为什么不使用std::vector<std::string>,这样您就不必担心尺寸了。随着新事物的插入,容器会自动调整大小。

答案 3 :(得分: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) {  }

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

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

所有其他特殊功能:析构函数,复制/移动构造函数和asignments由编译器生成。 Derived的构造函数仍然是:     Derived :: Derived():Base(40){} 另外......你可能想要私人或至少受到保护吗?

答案 4 :(得分:1)

正确的语法是

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

答案 5 :(得分:0)

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

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

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

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