我想以这种方式使用数组:
class Foo {
std::string *arrayOfPointersToString[]; // Array of pointers to string
int N;
public:
Foo(int capacity) : N(capacity) {
arrayOfPointersToString = new std::string[capacity];
}
};
但我有一个错误:不兼容的指针类型。我该怎么办?
答案 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];
}
}
需要注意的一点是,每个索引的值都不保证为空,因此对于每个索引,您都需要
在每个人身上调用new
并分配他们的值。
将它们分配给另一个变量的地址。
此外,由于您将自行管理动态内存,请务必使用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) {}
};