我有一个存储数组的类,我需要编写一个方法来返回指向该数组的指针,以便其他对象可以访问/修改它。
在我的程序的旧版本中,我通过使用C风格定义数组来实现这一点。即,拥有一个私有元素bool* list
,然后在构造函数中分配内存(并在析构函数中释放它)。这个方法非常简单:
bool* MyClass::getList() {
return list;
}
现在,我决定重写代码并使用std::vector<bool>
而不是经典数组。问题是我还将上述方法修改为:
bool* MyClass::getList() {
return &(list[0]);
}
这似乎是将C ++向量转换为C数组的标准方法。但是,我无法编译我的代码,我收到以下错误:
error: taking address of temporary [-fpermissive]
error: cannot convert ‘std::vector<bool>::reference* {aka std::_Bit_reference*}’ to ‘bool*’ in return
任何人都可以帮我解决这个问题并告诉我该怎么办?
(我还读过另一个选择是使用list.data()
作为指针,但这只适用于最新版本的C ++编译器。我不确定这是不是一个好主意。)< / p>
谢谢,
答案 0 :(得分:7)
你的思维方式一般是正确的,并且指出第一个元素就足够了。但是,std::vector<bool>
is not really a vector of bool
s因为它被实现为一个位集。 C ++标准委员会和图书馆工作组之间已达成共识,vector<bool>
应该被弃用并随后从标准库中删除,而功能将以不同的名称重新引入。但现在它仍然存在。
回到你的问题,你无法将bitset解释为布尔数组。因此,有两种可能的方法:
std::vector<bool>
替换为可为您提供正确行为的one of the alternatives。std::vector<bool>
转换为C数组。例如,您可以使用size()
预先分配内存,然后迭代向量并填充我们的数组。希望它有所帮助。祝你好运!
答案 1 :(得分:3)
bool* MyClass::getList() {
return &(list[0]);
}
这适用于任何类型,但std::vector<bool>
具有特殊实现,其中8个元素存储在1个字节中,因此似乎不可能将原始指针存储在其中。
答案 2 :(得分:0)
尝试string.copy():
bool array[100];
std::vector<bool>;
std::copy(vector.begin(), vector.end(), array);
答案 3 :(得分:0)
std::vector<bool>
使用内部模型,其中每个bool存储为单个位。这意味着它不是你想要的内部普通C数组,你不能毫不费力地将它转换成一个。
将std::vector<bool>
替换为std::deque<bool>
并且不使用deque部分,这将给出预期的行为。
另一种解决方案是使用std::vector<char>
代替并将值视为bools。只要在访问时正确地转换值,这将给出预期的行为。