如何在构造函数中初始化指向字符串的指针数组[重复]
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)
;
【讨论】:
以上是关于如何在构造函数中初始化指向字符串的指针数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章