C ++结构行为

时间:2017-07-28 19:21:58

标签: c++ struct

我试图提高我对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;
}

2 个答案:

答案 0 :(得分:6)

stacks.getStackAtIndex(0)

返回第一个Stack的副本,而

stacks.stacks[0]

返回对它的引用。 (c.f。std::vector::operator[])。

您可以通过将getStackAtIndex的返回类型更改为Stack的引用来解决此问题:

Stack& getStackAtIndex(int i) {
  return stacks[i];
}

答案 1 :(得分:2)

当您致电

时,您将在[i]处返回堆栈的副本
Stack Stacks::getStackAtIndex(int i);

这意味着你实际上并没有在该索引的堆栈上操作,而是通过从所需的堆栈中复制数据而构建的全新的索引。只需更改

的返回值即可
Stack

Stack&

另外,尽量不要使用命名空间std,你会惊讶地发现你使用的是多少东西。如果你被迫避免使用它,它可能会让你感到压力。

另外我注意到你用了

int N;

既是Stack中的数据成员又是

中的参数
void Stack::add(int);

我会改变这一点。