我正在努力提高我对C++语言的知识,并且正在制作一堆堆栈。下面是我问题的一个很短的例子:为什么我必须直接访问结构的成员才能改变它们,而不是使用函数来实现呢?如果有人知道为什么会发生这种情况,我们会非常感激的!谢谢
#include <iostream>
#include <vector>
using namespace std;
struct Stack {
int N;
vector<int> stack;
int len() { return stack.size(); }
void add(int N) { stack.push_back(N); }
};
struct Stacks {
vector<Stack> stacks;
Stack getStackAtIndex(int i) { return stacks[i]; }
void addStack(Stack stack) { stacks.push_back(stack); }
void printStacks() {
cout << "Printing stacks" << endl;
for (int i = 0; i < stacks.size(); i++) {
cout << "Stack #" << i << ": ";
for (int j = 0; j < stacks[i].len(); j++) {
cout << stacks[i].stack[j];
if (j != stacks[i].len()-1) cout << " -> ";
}
cout << endl;
}
}
};
int main() {
Stacks stacks;
Stack stack;
stack.add(1);
stacks.addStack(stack);
// This does not work:
// stacks.getStackAtIndex(0).add(2);
// This works:
stacks.stacks[0].stack.push_back(2);
stacks.printStacks();
return 0;
}发布于 2017-07-28 19:36:28
stacks.getStackAtIndex(0)返回第一个Stack的副本,而
stacks.stacks[0]返回对它的引用。(c.f.传播媒介::operator[])。
您可以通过将getStackAtIndex的返回类型更改为Stack的引用来修复此问题。
Stack& getStackAtIndex(int i) {
return stacks[i];
}发布于 2017-07-28 19:57:30
调用时,在i处返回堆栈的副本。
Stack Stacks::getStackAtIndex(int i);这意味着您实际上并不是在该索引下对堆栈进行操作,而是通过从所需的堆栈复制数据来构建一个全新的索引。只需将返回值改为
Stack至
Stack&另外,不要使用名称空间std,您会惊讶于您在这个名称空间中实际使用了多少东西。如果你被迫避免使用它,它可能会使你不知所措。
另外,我注意到你用
int N;作为Stack中的数据成员和
void Stack::add(int);我会改变这个。
https://stackoverflow.com/questions/45380966
复制相似问题