• <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>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Hide Implementation Classes

            Posted on 2013-09-28 22:32 eryar 閱讀(3604) 評論(8)  編輯 收藏 引用

            Hide Implementation Classes

            eryar@163.com

            摘要:很多程序員都用過private來隱藏函數和成員變量,實際上有些類也是可以被隱藏起來的。本文是對《API Design for C++》中2.2.5的翻譯,若不不當之處,歡迎指出。

            關鍵字:API Design for C++, Hide Classes

            除了可以隱藏類的變量與方法之外,還可以隱藏任意單純實現細節的類。很多程序員都用過隱藏方法和變量,但是好多也好像忘記了并不是所有的類都是公有的。實際上,有些類只在你的實現中需要,而不應該作為公開的接口暴露出來。

            例如,考慮一個簡單的煙花(Fireworks)類:一個接口可以用來指定煙花在屏幕上位置,控制煙花的顏色、速度和煙花顆粒(particle)的數量。明顯地,這個API就需要對煙花的每個顆粒進行追蹤,以便于在每幀更新顆粒的位置。這暗示著需要引入一個用來保存每個顆粒狀態的類FireParticle,但是這個API的用戶并不需要訪問這個類,它只在實現API時才需要。這樣的類就可以設置為私有(private),即作為類Fireworks私有的部分。代碼如下所示:

             

             1 /// -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: t -*-
             2 ///
             3 /// \file   fireworks.h
             4 /// \author Martin Reddy
             5 /// \brief  An illustration of using private classes.
             6 ///
             7 /// Copyright (c) 2010, Martin Reddy. All rights reserved.
             8 /// Distributed under the X11/MIT License. See LICENSE.txt.
             9 /// See http://APIBook.com/ for the latest version.
            10 ///
            11 
            12 #ifndef FIREWORKS_H
            13 #define FIREWORKS_H
            14 
            15 #include <vector>
            16 
            17 namespace apibook {
            18 
            19 ///
            20 /// A simple fireworks particle system, used to demonstrate
            21 /// the use of private classes to hide implementation state.
            22 ///
            23 class Fireworks
            24 {
            25 public:
            26     Fireworks();
            27 
            28     /// Set the (x, y) origin of the fireworks effect
            29     void SetOrigin(double x, double y);
            30     /// Set the RGB color (0..1) for each particle
            31     void SetColor(float r, float g, float b);
            32     /// Set the gravity acting on each particle (meters/sec)
            33     void SetGravity(float g);
            34     /// Set the speed of the particle simulation
            35     void SetSpeed(float s);
            36     /// Set the number of particles in the simulation
            37     void SetNumberOfParticles(int num);
            38 
            39     /// Start (or continue) the simulation
            40     void Start();
            41     /// Stop the simulation
            42     void Stop();
            43     /// Advance the simulation by dt seconds 
            44     void NextFrame(float dt);
            45 
            46 private:
            47     // FireParticle represents internal hidden state
            48     // (You could also forward declare this class and
            49     // only provide the definition in the .cpp file.)
            50     class FireParticle
            51     {
            52     public:
            53         double mX, mY;
            54         double mVelocityX, mVelocityY;
            55         double mAccelerationX, mAccelerationY;
            56         double mLifeTime;
            57     };
            58 
            59     double mOriginX, mOriginY;
            60     float mRed, mGreen, mBlue;
            61     float mGravity;
            62     float mSpeed;
            63     bool mIsActive;
            64     std::vector<FireParticle *> mParticles;
            65 };
            66 
            67 }
            68 
            69 #endif
            70 

            注意到在類FireParticle中我并沒有使用getter/setter。只要你愿意,當然也可以這樣做。但是也不是非常必要這么做,因為公有的接口是不能訪問這個類的。有些工程師也比較喜歡使用struct來代替class,to reflect that the structure is a Plain Old Data(POD) type。

            當然,你可能也想過隱藏類FireParticle,即在頭文件中也不出現。我將在下一節中講到怎樣來實現。

             

            Feedback

            # re: Hide Implementation Classes  回復  更多評論   

            2013-09-29 10:58 by 春秋十二月
            這里嵌套類FireParticle的變量并沒有被隱藏

            # re: Hide Implementation Classes  回復  更多評論   

            2013-09-29 17:46 by eryar
            如果給了頭文件,是可以看到源代碼,但是即使看到代碼,在程序的其他地方也不能定義一個FireParticle類的對象了。
            我是這么理解的。。。@ 春秋十二月

            # re: Hide Implementation Classes[未登錄]  回復  更多評論   

            2013-09-30 02:03 by 春秋十二月
            @eryar
            雖為私有,但暴露了它的定義,比如一個非正常情況#define private public,那么sizeof(Fireworks::FireParticle)是定義了的。

            # re: Hide Implementation Classes  回復  更多評論   

            2013-09-30 17:44 by eryar
            #define private public這招太狠了……
            這樣的話FireParticle是沒有達到隱藏的效果。
            那本書里面這里的隱藏是相對于private而言的,
            @春秋十二月

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-06 20:11 by ccsdu2009
            你這個不如impl!

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-09 19:15 by eryar
            什么是impl?
            還請指教
            @ccsdu2009

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-29 11:18 by Jayden Shui
            應該是pimpl吧。該書3.1.1.

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-29 18:38 by eryar
            哦,謝謝。。。
            :-)
            @Jayden Shui
            久久久青草久久久青草| 久久精品国产亚洲av麻豆小说| 国产精品成人99久久久久 | 久久99国产精品尤物| 69SEX久久精品国产麻豆| 国产精品99久久不卡| 深夜久久AAAAA级毛片免费看| 久久人人爽人人爽人人片AV麻烦| 99精品国产在热久久| 久久久久综合中文字幕| 国产成人久久精品激情| 亚洲精品99久久久久中文字幕| 国内精品人妻无码久久久影院 | 欧美一区二区精品久久| 亚洲精品午夜国产va久久| 97久久香蕉国产线看观看| 久久婷婷五月综合国产尤物app| 狠狠色丁香久久婷婷综| 99久久精品免费看国产一区二区三区 | 亚洲中文字幕无码久久综合网 | 九九久久自然熟的香蕉图片| 久久综合九色欧美综合狠狠| 久久99热精品| 久久天天躁狠狠躁夜夜96流白浆 | 国产成人香蕉久久久久| 久久久久久精品无码人妻| 青草久久久国产线免观| 99久久精品国产一区二区| 精品精品国产自在久久高清| 久久精品毛片免费观看| 亚洲∧v久久久无码精品| 久久久久久国产a免费观看黄色大片 | 国产国产成人精品久久| 2020久久精品国产免费| 久久亚洲精品中文字幕| 久久综合香蕉国产蜜臀AV| 婷婷久久久亚洲欧洲日产国码AV| 日本五月天婷久久网站| 国内精品伊人久久久久妇| 久久亚洲AV无码精品色午夜麻豆| 久久亚洲精品国产精品婷婷|