首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++结构行为

C++结构行为
EN

Stack Overflow用户
提问于 2017-07-28 19:21:58
回答 2查看 129关注 0票数 3

我正在努力提高我对C++语言的知识,并且正在制作一堆堆栈。下面是我问题的一个很短的例子:为什么我必须直接访问结构的成员才能改变它们,而不是使用函数来实现呢?如果有人知道为什么会发生这种情况,我们会非常感激的!谢谢

代码语言:javascript
运行
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-28 19:36:28

代码语言:javascript
运行
复制
stacks.getStackAtIndex(0)

返回第一个Stack的副本,而

代码语言:javascript
运行
复制
stacks.stacks[0]

返回对它的引用。(c.f.传播媒介::operator[])。

您可以通过将getStackAtIndex的返回类型更改为Stack的引用来修复此问题。

代码语言:javascript
运行
复制
Stack& getStackAtIndex(int i) {
  return stacks[i];
}
票数 6
EN

Stack Overflow用户

发布于 2017-07-28 19:57:30

调用时,在i处返回堆栈的副本。

代码语言:javascript
运行
复制
Stack Stacks::getStackAtIndex(int i);

这意味着您实际上并不是在该索引下对堆栈进行操作,而是通过从所需的堆栈复制数据来构建一个全新的索引。只需将返回值改为

代码语言:javascript
运行
复制
Stack

代码语言:javascript
运行
复制
Stack&

另外,不要使用名称空间std,您会惊讶于您在这个名称空间中实际使用了多少东西。如果你被迫避免使用它,它可能会使你不知所措。

另外,我注意到你用

代码语言:javascript
运行
复制
int N;

作为Stack中的数据成员和

代码语言:javascript
运行
复制
void Stack::add(int);

我会改变这个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45380966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档