• <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 閱讀(3603) 評論(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
            亚洲日本va午夜中文字幕久久| 久久人人爽人人爽人人片AV东京热 | 久久ww精品w免费人成| 深夜久久AAAAA级毛片免费看 | 久久精品中文字幕无码绿巨人| 性高湖久久久久久久久AAAAA| 久久久久亚洲精品男人的天堂 | 精品欧美一区二区三区久久久| 日韩精品久久久久久| 精品久久久久久亚洲精品| 国产成人无码精品久久久性色 | 亚洲欧美成人久久综合中文网| 色欲综合久久躁天天躁| 久久久久久久综合综合狠狠| 成人a毛片久久免费播放| 国内精品久久久久久久久| 欧美粉嫩小泬久久久久久久| 亚洲人AV永久一区二区三区久久 | 国内精品久久久久久久久电影网| 久久久久久久久66精品片| 亚洲七七久久精品中文国产| 色综合久久无码中文字幕| 狠狠色丁香婷综合久久| 精品人妻伦一二三区久久 | 亚洲AV无码久久| 99久久精品国内| 亚洲美日韩Av中文字幕无码久久久妻妇 | 日韩AV毛片精品久久久| 久久人妻少妇嫩草AV蜜桃| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久亚洲国产中v天仙www| 久久久久亚洲爆乳少妇无| 亚洲精品乱码久久久久久| 久久久久久久综合日本亚洲| 久久男人中文字幕资源站| 日韩人妻无码精品久久免费一 | 久久精品国产亚洲AV蜜臀色欲 | 久久99国产精品久久99| 久久久久国产精品麻豆AR影院| 久久亚洲精品成人av无码网站| 狠狠色综合久久久久尤物|