青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 30, 文章 - 0, 評論 - 64, 引用 - 0
數據加載中……

VC6.0中重載操作符函數無法訪問類的私有成員

在 C++ 中,操作符(運算符)可以被重載以改寫其實際操作。
同時我們可以定義一個函數為類的朋友函數(friend function)以便使得這個函數能夠訪問類的私有成員,
這個定義通常在頭文件中完成。

在Visual C++中定義一般的函數為朋友函數通常是沒有問題的。
然而對某些重載操作符的函數,
即使我們將它們定義為類的朋友函數,VC的編譯器仍然會顯示出錯信息,
認為這些朋友函數無權訪問類的私有成員。
我認為這應該是VC6.0的bug。

以下代碼就是個例子:

// 頭文件 “Sample.h”
            #include<iostream>
            using namespace std;
            class Sample {
            public:
            Sample();
            friend ostream &operator<<(ostream &out, const Sample s);
            friend istream &operator>>(istream &in, Sample & s);
            private:
            int x;
            };

// 實現文件 “Sample.cpp”
            #include “Sample.h”
            Sample::Sample() {
            x=0;
            }
            istream &operator>>(istream &in, Sample & s) {
            cout<<”Please enter a value”<<endl;
            in >> s.x ;
            return in;
            }
            ostream &operator<<(ostream &out, const Sample s) {
            cout << s.x << endl;
            return out;
            }

以上代碼在gnuc++中編譯運行毫無問題。但是在VC++6.0中編譯的時候就會出現以下的編譯錯誤:

Compiling…
Sample.cpp
c:\temp\sample.cpp(8) : error C2248: ‘x’ : cannot access private member declared in class ‘Sample’
c:\temp\sample.h(19) : see declaration of ‘x’
c:\temp\sample.cpp(13) : error C2248: ‘x’ : cannot access private member declared in class ‘Sample’
c:\temp\sample.h(19) : see declaration of ‘x’
Error executing cl.exe.Sample.obj - 2 error(s), 0 warning(s)

在VC++ 6.0中解決這個問題有以下幾種方法:

  • 在頭文件中實現作為朋友函數的操作符函數的重載,也就是說在實現文件”Sample.cpp”中將函數重載的實現去掉,而將頭文件修改如下:
    // 修改后的頭文件 1 “Sample.h”
                    #include<iostream>
                    using namespace std;
                    class Sample {
                    public:
                    Sample();
                    friend ostream &operator<<(ostream &out, const Sample s);
                    friend ostream &operator<<(ostream &out, const Sample s) {
                    cout << s.x << endl;
                    return out;
                    }
                    friend istream &operator>>(istream &in, Sample & s);
                    friend istream &operator>>(istream &in, Sample & s) {
                    cout<<”Please enter a value”<<endl;
                    in >> s.x ;
                    return in;
                    }
                    private:
                    int x;
                    };
    
        
  • 在頭文件中類定義之前將類和朋友操作符函數的原型特別聲明一下,也就是將頭文件修改如下(實現文件”Sample.cpp”不用作任何修改):
    // 修改后的頭文件 2 “Sample.h”
                    #include<iostream>
                    using namespace std;
                    // 以下3行代碼為新加入
                    class Sample;
                    ostream &operator<<(ostream &out, const Sample s);
                    istream &operator>>(istream &in, Sample & s);
                    class Sample {
                    public:
                    Sample();
                    friend ostream &operator<<(ostream &out, const Sample s);
                    friend istream &operator>>(istream &in, Sample & s);
                    private:
                    int x;
                    };
    
        
  • 第三種方法是對I/O名空間的使用實行明確聲明,也就是說在頭文件”Sample.h”中直接寫:
    #include<iostream>
    using std::ostream;
    using std::istream
    ….
    取代 “using namespace std;”
    注意:在這個例子里我們在實現文件 “Sample.cpp”中包含 “using namespace std;”這句話,否則在實現中就不能使用 “cout” , “cin”, “<< “, “>>” 和 endl 這些關鍵字和符號。修改后的完整代碼如下:

     

    // Sample.h
                    #include<iostream>
                    using std::istream;
                    using std::ostream;
                    class Sample {
                    public:
                    Sample();
                    friend ostream &operator<<(ostream &out, const Sample s);
                    /*friend ostream &operator<<(ostream &out, const Sample s) {
                    cout << s.x << endl;
                    return out;
                    }*/
                    friend istream &operator>>(istream &in, Sample & s);
                    /*friend istream &operator>>(istream &in, Sample & s) {
                    cout<<”Please enter a value”<<endl;
                    in >> s.x ;
                    return in;
                    }*/
                    private:
                    int x;
                    };
    // “Sample.cpp”
                    #include “Sample.h”
                    using namespace std;
                    Sample::Sample() {
                    x=5;
                    }
                    istream &operator>>(istream &in, Sample & s) {
                    cout<<”Please enter a value”<<endl;
                    in >> s.x ;
                    return in;
                    }
                    ostream &operator<<(ostream &out, const Sample s) {
                    cout << s.x << endl;
                    return out;
                    }
    
        

posted on 2008-12-08 23:50 henry08 閱讀(2394) 評論(5)  編輯 收藏 引用 所屬分類: C++

評論

# re: VC6.0中重載操作符函數無法訪問類的私有成員  回復  更多評論   

能講解一下其內在原因是什么嗎?
2008-12-09 09:45 | abettor

# re: VC6.0中重載操作符函數無法訪問類的私有成員  回復  更多評論   

猜測的成分太多了,friend function好像不是翻成朋友函數,叫友元吧
2008-12-09 09:51 | zuhd

# re: VC6.0中重載操作符函數無法訪問類的私有成員  回復  更多評論   

visual c++ 2005 就支持了
2008-12-10 21:45 | 漂漂

# re: VC6.0中重載操作符函數無法訪問類的私有成員  回復  更多評論   

hanxiaodkf
2009-07-14 16:50 | han

# re: VC6.0中重載操作符函數無法訪問類的私有成員[未登錄]  回復  更多評論   

Thanks
2012-06-25 09:43 | yong
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区不卡视频在线观看| 欧美专区福利在线| 久久精品国产2020观看福利| 亚洲高清资源| 米奇777在线欧美播放| 香蕉免费一区二区三区在线观看 | 亚洲级视频在线观看免费1级| 欧美精品一卡| 欧美日韩美女| 欧美黄色一区| 欧美午夜大胆人体| 国产精品扒开腿做爽爽爽视频| 欧美福利一区二区| 国产精品青草久久| 国产精品永久入口久久久| 国产日韩精品久久| 日韩网站在线| 一本色道**综合亚洲精品蜜桃冫| 亚洲区一区二区三区| 中文亚洲欧美| 久久免费精品视频| 欧美三级中文字幕在线观看| 国产精品入口福利| 亚洲欧洲一区二区三区在线观看 | 久久国产精品久久久久久| 欧美福利视频| 亚洲美女淫视频| 久久在线视频| 国产日韩欧美视频在线| 亚洲狠狠婷婷| 欧美成年人视频| 欧美一区二区三区的| 欧美激情精品久久久六区热门| 亚洲电影下载| 久久人人97超碰精品888| 欧美日韩在线免费观看| 亚洲国产欧美一区| 美女91精品| 久久久人成影片一区二区三区观看 | 国产亚洲免费的视频看| 一本一道久久综合狠狠老精东影业 | 久久久99国产精品免费| 国产精品日韩久久久久| 中日韩美女免费视频网址在线观看 | 在线精品观看| 亚洲小视频在线| 亚洲清纯自拍| 欧美日一区二区在线观看 | 蜜桃精品久久久久久久免费影院| 99在线观看免费视频精品观看| 欧美在线视频免费| 一区二区三区在线高清| 亚洲一区日韩在线| 欧美激情性爽国产精品17p| 亚洲一区国产视频| 欧美一区二区三区免费视| 国内一区二区三区在线视频| 欧美1区视频| 欧美精品亚洲一区二区在线播放| 日韩视频不卡| 欧美专区一区二区三区| 日韩视频在线一区二区三区| 亚洲网站在线观看| 亚洲国产乱码最新视频| 亚洲视频在线视频| 亚洲精品视频中文字幕| 午夜精品久久久| 一区二区av| 欧美激情国产精品| 农夫在线精品视频免费观看| 国产精品久久久久影院亚瑟| 欧美高清在线| 激情视频一区| 欧美在线观看视频在线| 性亚洲最疯狂xxxx高清| 欧美日韩中文在线观看| 亚洲国产精彩中文乱码av在线播放| 国产精品久久久久久福利一牛影视| 欧美激情视频网站| 亚洲黄色免费电影| 美女视频黄免费的久久| 麻豆国产精品777777在线| 国产日产欧美一区| 午夜精品美女自拍福到在线 | 欧美日韩在线观看一区二区| 麻豆精品一区二区av白丝在线| 国产一区二区三区免费在线观看| 中国成人在线视频| 久久精品三级| 欧美影视一区| 久久人人爽国产| 亚洲电影下载| 亚洲乱码久久| 日韩亚洲欧美成人一区| 欧美成人a∨高清免费观看| 亚洲精品乱码久久久久久久久| 亚洲人线精品午夜| 国产精品视频大全| 欧美xxxx在线观看| 亚洲午夜三级在线| 欧美成人午夜激情| 午夜精品理论片| 亚洲福利久久| 国产日韩欧美精品一区| 女人天堂亚洲aⅴ在线观看| 亚洲影音一区| 国产欧美大片| 欧美福利在线| 亚洲免费在线播放| 日韩天堂在线观看| 亚洲第一区在线| 国产亚洲一区二区在线观看| 欧美成年人视频网站| 欧美淫片网站| 久久精品五月| 麻豆精品视频| 女人香蕉久久**毛片精品| 久久精品免费观看| 午夜精品久久久99热福利| 亚洲天堂成人在线视频| 亚洲在线视频观看| 亚洲网在线观看| 午夜在线成人av| 欧美一区亚洲| 久久影院午夜片一区| 久久久国产精品一区二区中文| 亚洲专区欧美专区| 欧美一区二区免费| 亚洲婷婷综合久久一本伊一区| 伊人久久av导航| 日韩亚洲欧美一区二区三区| av不卡免费看| 久久激情视频| 亚洲片在线资源| 欧美一级播放| 欧美—级高清免费播放| 欧美四级电影网站| 国模一区二区三区| 一本色道久久综合亚洲精品小说| 国产精品99久久久久久宅男 | 欧美国产精品va在线观看| 欧美好骚综合网| 国产在线不卡| 亚洲午夜激情免费视频| 美女网站久久| 性色av一区二区怡红| 欧美顶级大胆免费视频| 国产亚洲第一区| 亚洲欧美日韩国产成人| 亚洲欧洲精品一区二区| 久久精品毛片| 在线观看一区视频| 久久精品人人做人人爽电影蜜月| 日韩视频―中文字幕| 欧美激情在线有限公司| 亚洲第一毛片| 亚洲国产婷婷| 欧美激情一区二区三区蜜桃视频 | 樱桃成人精品视频在线播放| 亚洲女人av| 亚洲一区二区三区视频| 欧美视频中文在线看| 午夜精品影院| 久久精品盗摄| 狠狠色综合日日| 久久婷婷丁香| 亚洲综合激情| 国产欧美亚洲精品| 国产欧美va欧美va香蕉在| 久久精品五月| 免费在线欧美视频| 一本久道久久综合中文字幕| 99精品欧美一区二区三区| 国产精品永久免费| 欧美mv日韩mv亚洲| 免费亚洲电影| 欧美午夜不卡影院在线观看完整版免费| 亚洲图片在线观看| 欧美专区18| 香蕉免费一区二区三区在线观看 | 国产一区二区日韩精品| 久久久亚洲欧洲日产国码αv | 欧美性猛交xxxx乱大交蜜桃 | 久久日韩粉嫩一区二区三区| 开元免费观看欧美电视剧网站| 日韩视频一区二区在线观看 | 国产精品激情av在线播放| 欧美凹凸一区二区三区视频| 国产精品www994| 亚洲精品五月天| 日韩视频免费观看高清完整版| 久久av资源网站| 久久国产精品久久精品国产| 欧美午夜a级限制福利片| 亚洲国产精品热久久| 亚洲国产经典视频| 免费在线欧美视频| 91久久久一线二线三线品牌| 亚洲成人在线网站| 欧美在线观看视频|