将结构指针传递给索引为vs而没有

时间:2017-09-23 16:47:20

标签: c++

说我有原型,

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;
    }
}

1 个答案:

答案 0 :(得分:1)

如果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