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

时间:2016-11-07 17:52:04

标签: c++ arrays constructor

我想以这种方式使用数组:

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

但我有一个错误:不兼容的指针类型。我该怎么办?

2 个答案:

答案 0 :(得分:3)

如果不想了解动态分配字符串数组的原因,可以使用:

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. 将它们分配给另一个变量的地址。

  3. 此外,由于您将自行管理动态内存,请务必使用delete为您分配的所有内容致电new,并确保在使用{分配的所有内容上致电delete[] {1}}。

答案 1 :(得分:1)

不兼容性错误是因为您已声明数组保存指针,但之后尝试分配实际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) {}
};