说我有原型,

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/

10-17 01:32