如何在构造函数中初始化指向string的指针数组

How to initialize an array of pointers to string in the constructor

本文关键字:string 指针 数组 初始化 构造函数      更新时间:2023-10-16

我想这样使用数组:

class Foo {
    std::string *arrayOfPointersToString[]; // Array of pointers to string
    int N;
public:
    Foo(int capacity) : N(capacity) {
        arrayOfPointersToString = new std::string[capacity];
    }
};

但是我有一个错误:指针类型不兼容。我能做什么?

在不太了解动态分配字符串数组的原因的情况下,您可以使用以下命令:

std::string *stringArray = new std::string[5];

但是,如果你想要一个动态分配的字符串指针数组,一个可能的解决方案是使用:

class foo{
    std::string ** arrayOfStringPointersToString;
public:
    foo(int capacity) : N(capacity) {
        arrayOfPointersToString = new std::string*[capacity];
    }
}
需要注意的一个关键问题是,不能保证每个索引的值为空,因此对于每个索引,您需要
  1. 分别调用new并赋值。

  2. 将它们赋值给另一个变量的地址。

此外,由于您将自己管理动态内存,请记住在使用new分配的所有内容上调用delete,并确保在使用new[]分配的所有内容上调用delete[]

不兼容错误是因为您声明了数组来保存指针,但然后试图分配一个实际的std::string对象数组而不是指针数组。

如果你想要一个指针数组,你需要修改你的new[]语句来分配一个指针数组,而不是一个对象数组:

class Foo {
    std::string* arrayOfPointersToStrings[];
    int N;
public:
    Foo(int capacity) : N(capacity) {
        arrayOfPointersToStrings = new std::string*[capacity];
    }
    ~Foo() {
        delete[] arrayOfPointersToStrings;
    }
};

但是,如果你想要一个对象数组,你需要修改你的数组声明,声明一个对象数组,而不是指针数组:

class Foo {
    std::string* arrayOfStrings;
    int N;
public:
    Foo(int capacity) : N(capacity) {
        arrayOfStrings = new std::string[capacity];
    }
    ~Foo() {
        delete[] arrayOfStrings;
    }
};

无论哪种方式,您都应该使用std::vector而不是手动使用new[]/delete[]:

class Foo {
    std::vector<std::string*> arrayOfPointersToStrings;
public:
    Foo(int capacity) : arrayOfPointersToStrings(capacity) {}
};

class Foo {
    std::vector<std::string> arrayOfStrings;
public:
    Foo(int capacity) : arrayOfStrings(capacity) {}
};