我有一個包含固定大小陣列的類節點。我有另一個類,它創建一個實體 myNode 并呼叫一個函式來為陣列中的欄位分配 5 個值。我想通過參考傳遞陣列,以便函式修改實際陣列而不是副本,但我不知道如何。
節點:
class Node
{
public:
// Constructor, destructor, other members, etc
uint8_t mArray[5];
}
工人:
class worker
{
void doStuff(uint8_t (&arr)[5])
{
arr[0] = 12;
arr[1] = 34;
arr[2] = 56;
arr[3] = 78;
arr[4] = 90;
}
int main()
{
Node *myNode = new Node();
doStuff(myNode->mArray);
// myNode->mArray is not modified
}
}
uj5u.com熱心網友回復:
是的,陣列被修改了。一個最小的可重現示例:
#include <cstdint>
#include <iostream>
class Node {
public:
uint8_t mArray[5];
};
class worker {
void doStuff(uint8_t (&arr)[5]) {
arr[0] = 12;
arr[1] = 34;
arr[2] = 56;
arr[3] = 78;
arr[4] = 90;
}
public:
int main() {
Node *myNode = new Node();
doStuff(myNode->mArray);
for(auto v : myNode->mArray) {
std::cout << static_cast<unsigned>(v) << ' ';
std::cout << '\n';
}
delete myNode;
return 0;
}
};
int main() {
worker w;
return w.main();
}
這會列印出預期的:
12 34 56 78 90
但是,如果您使用Node&該功能會更容易:
#include <cstdint>
#include <iostream>
class Node {
public:
uint8_t mArray[5];
};
class worker {
void doStuff(Node& n) {
n.mArray[0] = 12;
n.mArray[1] = 34;
n.mArray[2] = 56;
n.mArray[3] = 78;
n.mArray[4] = 90;
// or just:
// n = Node{12,34,56,78,90};
}
public:
int main() {
Node *myNode = new Node();
doStuff(*myNode);
// ...
delete myNode;
return 0;
}
};
int main() {
worker w;
return w.main();
}
uj5u.com熱心網友回復:
在引數中按值傳遞時,永遠不會復制 C 樣式的陣列。當作為普通引數傳遞時,它衰減為指向第一個元素的指標。因此,您不需要使用參考,只需使用普通的指標或陣列引數即可。
class worker
{
void doStuff(uint8_t arr[5]) // same as uint8_t *arr
{
arr[0] = 12;
arr[1] = 34;
arr[2] = 56;
arr[3] = 78;
arr[4] = 90;
}
int main()
{
Node *myNode = new Node();
doStuff(myNode->mArray);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493780.html
