2017-07-28 53 views
3

我想提高我對C++語言的知識,並製作一堆棧。下面是我的問題的一個非常簡短的例子:爲什麼我必須直接訪問結構的成員才能更改它們,而不是使用函數來實現呢?如果有人知道爲什麼會發生這樣的答案,非常感謝!由於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; 
} 
+6

也許有getStackAtIndex返回一個引用? – Max

+1

[可能的重複[什麼意思是返回一個引用?](https://stackoverflow.com/questions/13718465/what-does-it-mean-to-return-a- reference) – AndyG

回答

6
stacks.getStackAtIndex(0) 

返回第一個Stack的副本,而

stacks.stacks[0] 

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

您可以通過改變getStackAtIndex返回類型的Stack參考解決這個問題:

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

您在返回堆棧的副本[I]當你調用

Stack Stacks::getStackAtIndex(int i); 

這意味着您實際上並不是在該索引處的堆棧上操作,而是通過從您想要的堆棧中複製數據構建的全新的操作。就在返回值從

Stack 

改變

Stack& 

也儘量不要使用std命名空間,你有多少東西使用實際上是該命名空間你會感到驚訝。如果你曾經被迫避免使用它,它可能會壓倒你。

此外,我注意到您使用

int N; 

在堆棧兩個數據成員和

void Stack::add(int); 

參數我會改變這一點。