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

Posted

技术标签:

【中文标题】如何在构造函数中初始化指向字符串的指针数组[重复]【英文标题】:How to initialize an array of pointers to string in the constructor [duplicate] 【发布时间】:2016-11-07 17:52:04 【问题描述】:

我想这样使用数组:

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

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

【问题讨论】:

为什么不使用std::vector arrayOfPointersToString = new std::string*[capacity]; 这是作业的一部分... 指向字符串的指针数组毫无意义。也许你的任务可以满足一个字符串数组。 【参考方案1】:

如果你不知道为什么要动态分配字符串数组,你会使用这个:

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

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

class foo
    std::string ** arrayOfStringPointersToString;
public:
    foo(int capacity) : N(capacity) 
        arrayOfPointersToString = new std::string*[capacity];
    

需要注意的关键是每个索引的值不保证为空,因此对于每个索引,您都需要

    对它们每个调用new 并分配它们的值。

    将它们分配给另一个变量的地址。

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

【讨论】:

动态内存的好资源是:cplusplus.com/doc/tutorial/dynamic【参考方案2】:

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

【讨论】:

以上是关于如何在构造函数中初始化指向字符串的指针数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?

在构造函数初始化器列表中初始化函数指针数组 - 错误

添加指向数组的指针时出现分段错误

在 C++ 中使用指针和指向指针参数的指针创建构造函数

是否可以定义指向构造函数的函数指针?

如何将指向数组的指针存储在数组中? [关闭]