如果我有这个功能:
void initPoints(sf::Vector2f points[]);
为什么我可以这样做:
sf::Vector2f[] vecs = {sf::Vector2f(0,0), etc};
initPoints(vecs);
但是不能这样做吗?
initPoints({sf::Vector2f(0,0), etc});
VS给我第二个错误,但不是第一个错误。
答案 0 :(得分:3)
使用std::vector
或std::array
,您可以更轻松地解决问题:)
此外,std::vector
符合RAII标准,因此您无需自己管理内存。通常,STL类比C类数组好。
#include <vector>
#include <initializer_list>
// ...
std::vector<sf::Vector2f> vecs = { Vector2f(0,0), etc };
然后:
initPoints(const std::vector<sf::Vector2f>& vec) {
// ...
}
initPoints(vecs);
答案 1 :(得分:1)
C ++通常不允许您将实际数组作为函数参数传递。它有一个方便的功能,让你认为这是可能的,因为你可以实际传递一个指针。
换句话说:
void initPoints(sf::Vector2f points[]);
与
相同void initPoints(sf::Vector2f* points);
请注意,initPoints
不知道points
的长度,因此通常您也会传递一个长度参数:
void initPoints(sf:Vector2f* points, size_t length);
你想要做的只是在C ++ 11之前无效。在C ++ 11中,您可以重载initPoints()
以获取std::initializer_list<sf::Vector2f>
,语法将正常工作。
您正在使用的数组类型通常称为“C风格数组”。它存在于C中,从一开始就存在于C ++中。它有各种限制,例如你刚刚遇到的问题。看起来你真的想要std::vector
。使用std::vector
有一些细微差别,我不知道你对C ++的理解程度,所以我不知道这些短语“通常你不想按价值传递它们”或“我会建议你模仿STL函数并传递开始/结束迭代器而不是“对你有意义。您最终会遇到使这些语句有用的语言部分。你现在不需要担心它们。