说我有原型,
void display(const someStruct& ptr);
void display(const someStruct& ptr, int arraySize);
其中ptr是类型
simeStruct *ptr = new someStruct[arraySize];
假设该结构显然具有各种成员,并且ptr已用于填充。现在,如果要显示第一个索引,我将其命名为
someNamespace::display(pKingdom[0]);
实现是
void display(const someStruct& ptr) {
cout << ptr.someMember1 << ", " << ptr.someMember2;
}
如果我通过以下方式使用重载函数,可以在这里调用整个结构:
simeNamespace::display(ptr[arraySize], arraySize);
还是那个电话无效?在编译时,它是尝试从第一个单元格打印还是由于调用不正确而要打印垃圾?
编辑:忘记执行重载功能
void display(const someStruct& ptr, int arraySize) {
cout << "SomeOutput is" << endl;
for (int i = 0; i < arraySize; i++) {
cout << i + 1 << ". " << ptr.someMember1 << ", " << ptr.someMember2;
}
}
最佳答案
万一void display(const Foo& ref, int arraySize)
函数等待对象Foo通过,然后将其作为引用,这意味着您的方法可以直接更改原始Foo(const
可以防止这种情况,但是正如@aschepler所提到的,它仍然可能)
要访问分配的内存,您想传递指针,就像:
void display(const Bar* ptr, int arraySize) {
for (int i = 0; i < arraySize; i++) {
std::cout << i + 1 << ") " << ptr[i].a << ", " << ptr[i].b << "\n";
}
}
用法
display(barPtr, arraySize);
其中Bar *barPtr = new Bar[arraySize]
。或者,如果您仍然想通过引用传递,请执行以下操作:void display(const Bar (&ref)[100], int arraySize) {
for (int i = 0; i < arraySize; i++) {
std::cout << i + 1 << ") " << ref[i].a << ", " << ref[i].b << "\n";
}
}
在这种情况下,您需要在声明中写入大小(例如100,不能为变量),用法为
display(bar, arraySize);
,其中Bar bar [arraySize]
。当然,您可以为此使用模板:template <unsigned int N>
void display(const Bar (&ref)[N]) {
for (int i = 0; i < N; i++) {
std::cout << i + 1 << ") " << ref[i].a << ", " << ref[i].b << "\n";
}
}
用法是
display<arraySize>(bar);
,其中Bar bar [arraySize]
是您的实际对象。但是,在这种情况下,我建议您使用容器,例如vector
。关于c++ - 将结构指针传递给具有索引vs不具有索引的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46381972/