簡體   English   中英

函數返回意外的struct值

[英]Function returning unexpected struct values

我是結構和用戶定義的數據類型的新手,我試圖創建一個返回結構的函數:

評論突出了問題:

#include <iostream>

using namespace std;

struct num {
    int n[2];
};

num func( num x, int a, int b) {
    x.n[0] = a+b;
    x.n[1] = a*b;
    return x;
}

int main() {
    int x,y;
    num s1;
    cout << "enter: ";
    cin >> x >> y;
    func(s1,x,y);
    cout << s1.n[0] << "\n" << s1.n[1];        // THIS GIVES ERROR
    cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];  // THIS DOENST GIVE ERROR
    return 0;
}

我理解第二種方法有意義並返回struct變量。 然后放一個點來解決struct的內部變量。

但我不明白為什么第一種方法失敗 ,或給出奇數輸出。 該函數已完成其工作,即使s1.n[0] = x + ys1.n[1] = x*y
現在,打印s1.n[0]應該只打印x + y 我們如何檢查和糾正函數的內部工作原理?

您必須將返回的值分配給main中的結構對象

s1 = func(s1,x,y);

在體內,該函數處理原始對象的副本。 它不會更改原始對象,因為它是按值傳遞的。

另一種方法是通過引用傳遞結構

void func( num &x, int a, int b) {
    x.n[0] = a+b;
    x.n[1] = a*b;
}

在這種情況下,你可以寫

func(s1,x,y);

或者你可以使用甚至所謂的C方法通過引用傳遞

void func( num *x, int a, int b) {
    x->n[0] = a+b;
    x->n[1] = a*b;
}

並稱之為

func( &s1, x, y );

至於這個說法

cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];  

然后您訪問由函數的兩次調用返回的兩個臨時對象的數據成員。 執行此語句后,將刪除這些臨時對象。

看起來你永遠不會分配func()的返回值。 您的函數返回結構,但您永遠不會分配它。 要解決這個問題,你應該能夠簡單地說: s1 = func(s1,x,y); 這會將結構的修改版本分配給s1變量。

或者,您可以重寫func()以接受指向結構的指針。 這將允許您修改結構而不必返回它:

 void func( num *x, int a, int b) {
     x->n[0] = a+b;
     x->n[1] = a*b;
 }

然后你只需要調用func()來調用: func(&s1, x, y);

您沒有通過引用傳遞結構,因此結果。 請嘗試以下方法:

void func(num &x, int a, int b) { 
    x.n[0] = a+b;
    x.n[1] = a*b;
}

由於你的結構是通過引用傳遞的,所以函數不需要返回任何內容,無論如何它都會被更改。 虛空會更合適。

這是因為您已經按值傳遞了結構,而您的意圖看起來像是要通過引用傳遞。 查看此鏈接: http//courses.washington.edu/css342/zander/css332/passby.html

num func( num &x, int a, int b) 

應該解決你的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM