繁体   English   中英

C ++结构行为

[英]C++ struct behavior

我正在努力提高我对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;
}
stacks.getStackAtIndex(0)

返回第一个Stack的副本,而

stacks.stacks[0]

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

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

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

当你打电话时,你正在[i]返回堆栈的副本

Stack Stacks::getStackAtIndex(int i);

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

Stack

Stack&

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

另外我注意到你用过

int N;

作为Stack中的数据成员和参数

void Stack::add(int);

我会改变这个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM