簡體   English   中英

運算符>>重載到嵌套類成員的正確語法?

[英]Correct syntax for operator >> overloading to members of nested class?

我有類 Address嵌套在類 Student中,我想通過 istream 將每個輸入行輸入到類 Studentoperator>>重載。

class Address {
public:
    ....

private:
    int house_no;
    string street;
    string city;
    string postcode
};


class Student {
public:
    ....
    friend istream& operator>>(istream& iss, Student& Obj) {
        iss >> Obj.roll_no >> Obj.name 
       >> Obj.addr.house_no >> Obj.addr.street >> Obj.addr.city >> addr.postcode;    //problem line
        return iss;
}

private:
    int roll_no;
    string name;
    Address addr;
};


//Sample line of test data (fields delimiter is comma):
1101, Alice Rilley, 421, Main St., New York, 230011
2202, Bert McDonald, 152, Railroad St., Madison, 120022
...

我的鏈接 istream(問題行)沒有解決錯誤消息:

./include/Student.h: In function ‘std::istream& operator>>(std::istream&, Student&)’:
./include/Student.h:23:60: error: ‘int Address::house_no’ is private within this context
   23 |                 iss >> Obj.roll_no >> Obj.name >> Obj.addr.house_no >> ......

我在 SO 中只找到了一篇類似的帖子,但它是針對“運算符 << ”的,與我的需要相反。 而且,我很難消化。 我在一行中讀取並將該行輸入到類 Student的對象成員(尤其是嵌套類 Address )中的正確語法是什么? 非常感謝!

問題不在於運營商本身,而在於成員的可見性。 您正在使用Address類作為Student的成員,但不能從它訪問Address::house_no成員(不僅對於輸入運算符)。

一種解決方案(一個簡單但不好的解決方案)是打開Address的成員:

class Address {
public:
    ....

//private:
public:
    int house_no;
    string street;
    string city;
    string postcode
};

但更好的方法是為Address定義一個輸入運算符:

class Address {
public:
    ....

private:
    friend istream& operator>>(istream& iss, Address& Obj);

    int house_no;
    string street;
    string city;
    string postcode
};


class Student {
public:
    ....
    friend istream& operator>>(istream& iss, Student& Obj);

private:
    int roll_no;
    string name;
    Address addr;
};

istream& operator>>(istream& iss, Address& Obj) {
    iss >> Obj.house_no >> Obj.street >> Obj.city >> Obj.postcode;
    return iss;
}

istream& operator>>(istream& iss, Student& Obj) {
    iss >> Obj.roll_no >> Obj.name >> Obj.addr;
    return iss;
}

暫無
暫無

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

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