簡體   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