`
javahigh1
  • 浏览: 1276439 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

如何访问一个类的保护变量

 
阅读更多

或许很多人看了我这个标题,很想打我:类的变量都私有了。你访问个P啊。

不过事实上地球还真有类似的需求。

记得2004年的时候,那会做个小的游戏引擎,大部分的数据都是私有或者保护的,这些在应付游戏本身的时候已经完全足够了。但是后来做编辑器的时候,发现绝大部分私有或者保护的成员都是需要被外部访问到的。但是实在又不想每个函数都开个 T& GetXXX(). 这样跟public没啥区别了。

一气之下,就在编辑器里stdafx.h里直接把 protected和private全部define成public了。 我的引擎当时是以源代码的形式编译的。这个一点问题都没有。

前段时间使用VS 2010的MFC Outlook Tabbar。我的Outlook Tabbar是在插件里创建的。有几个页也是由插件数量决定的。于是悲剧来了。那个小图标的ImageList 是个私有的变量。 而且,我必须得动态往这个ImageList里添加ICON。。不然。。。哼哼。。

这里因为MFC不是我自己的东西。我不能把protected给定义成public。除非我把MFC的代码全加到工程里来自己编译。否则会导致unresolved symbol的。憋了半天。想了个损招:

CMFCOutlookBarTabCtrl 这个是包含了ImageList的类。是MFC的。怎么办的?有啥办法能访问到proteced的变量呢?那就是派生了。

于是:

class CMFCOutlookBarTabCtrlDerived: public CMFCOutlookBarTabCtrl
{
public:
CImageList* GetToolbarImageList()
{
return &m_imagesToolbar;
}
CMFCOutlookBarToolBar* GetToolbar()
{
return &m_wndToolBar;
}
};

派生类当然顺理成章的能访问父类的。嘿嘿。

但是能从OutlookToolbar里拿到的只能是 CMFCOutlookbarTabCtrl. 怎么办呢?强行转换一下。C语言的无敌cast啊。

CMFCOutlookBarTabCtrlDerived* pDevired = (CMFCOutlookBarTabCtrlDerived*)m_pCurrOutlookWnd;
CImageList* pSmallImgList = (CImageList*)pDevired->GetToolbarImageList();
pSmallImgList->Add(pElement->hSmallIcon() );

搞定收工。

注意:此法比较卑鄙,未成年人请勿模仿。

分享到:
评论

相关推荐

    Qt 多线程访问同一个变量

    这样,我们就可以确保在任何时候只有一个线程能访问受保护的资源。 在描述中提到的源码中,ThreadA和ThreadB可能是两个继承自QThread的类。这两个类可能都有自己的run()函数,这是Qt线程执行的主要入口点。每个线程...

    C++ 包含类两个类互相调用彼此的类成员变量和方法

    这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以避免编译错误和设计上的问题。下面我们将深入探讨这个主题。 首先,我们要理解C++中的“包含...

    View类变量的访问

    这样,调用者可以通过`View`对象间接访问变量,而不是直接访问类的内部。 4. **使用回调函数**:`View`类可以接受一个回调函数,当需要更新变量时,调用这个函数。这使得其他类能够参与`View`的变量更新过程,而不...

    类中的成员变量

    `public` 是一个访问控制修饰符,它表示该成员变量或方法可以被任何地方访问,无论是类内部还是外部,甚至是继承自该类的子类。这种开放性的设计使得数据和方法易于访问,但也可能导致程序的不安全性增加。 例如,...

    C++类变量声明

    Java中的构造函数默认会有一个无参构造函数,除非程序员明确声明。 3. **静态变量**:C++和Java都支持静态变量,但C++中的静态成员属于类本身,而非类的每个实例,而在Java中,静态变量也适用于类的所有实例。 4. ...

    C# 公有变量 私有变量 静态变量

    // 另一个类中访问公有变量 MyClass obj = new MyClass(); Console.WriteLine(obj.PublicVar); // 输出10 obj.PublicVar = 20; // 修改公有变量的值 ``` **私有变量(private)** 与公有变量相反,私有变量只能在...

    JAVA类的方法调用和变量

    实例化一个类意味着创建了一个对象,这个对象可以访问类中定义的非静态成员。 2. **抽象类**:抽象类是含有至少一个抽象方法的类。抽象方法只有方法签名,没有具体实现。抽象类不能被实例化,它们通常作为其他类的...

    C#公共变量测试,多类访问

    当一个变量被声明为public,它可以在程序的任何地方被访问,包括同一个类的不同实例、子类以及不同类的实例。这使得公共变量成为实现多类访问的基础。下面将详细阐述C#中的公共变量以及如何在多类间进行访问。 首先...

    采用全局变量方式实现多线程的通信

    为避免这种情况,我们需要同步机制,如互斥量(mutex)、临界区(critical section)或信号量(semaphore),来确保一次只有一个线程能访问该全局变量。 在MFC框架中,我们可以使用`CSingleLock`或`CMultiLock`类来...

    java 如何访问同名的方法或变量

    8. **静态导入(Static Import)**:Java允许静态导入一个类的所有静态成员,这样就可以在不指定类名的情况下直接使用它们,但应谨慎使用,以避免代码的可读性问题。 9. **包(Packages)**:Java通过包来组织类,...

    Java四种变量特性

    - `private`修饰的变量只能在定义它的类内部访问,不能被同一个包内的其他类或不同包的类访问。这是最低级别的访问权限,用于保护数据的安全性和实现封装。 - `private`变量通常作为类的内部状态,不希望外部代码...

    OC访问变量权限

    `@public` 访问修饰符表示最高的访问级别,允许任何地方的代码访问该成员,无论是同一个类、子类还是其他任何外部类。当你希望一个变量或方法可以被广泛应用或跨类共享时,通常会将其声明为 `@public`。例如: ``...

    python 类的私有变量和私有方法.docx

    例如,如果在类`pub`中有一个`_name`变量,尽管可以使用`a._name`来访问它,但这样做可能会破坏类的封装性,因为这并不是设计的初衷。 2. 双下划线`__xx`: 使用双下划线定义的变量`__info`是私有类型的变量,它们...

    Java-面向对象设计-类和对象.docx

    声明一个类时,在class关键字后面加上类的名称,这样就创建了一个类,然后在类的里面定义成员变量和方法。 类的访问控制符有四种:默认模式、private、私有、public、公有、protected、保护。Java提供了一系列的...

    2. 定义一个Card类,表示扑克牌,该类包括下述成员

    根据给定的信息,我们将深入探讨如何定义一个`Card`类来表示扑克牌,并且实现相关的功能,例如构造方法、获取牌面和花色的方法以及重写的`toString()`方法。此外,我们还将简要讨论如何利用这个`Card`类来生成一副...

    C类的成员变量和成员函数-C教程共3页.pdf.zip

    5. 友元函数和友元类:可以访问类的私有和保护成员,增强类之间的交互。尽管不是成员函数,但它们与类的关系密切。 三、访问控制与封装 封装是面向对象编程的关键原则之一,通过设置适当的访问权限,确保数据的安全...

    c++访问私有private成员变量的常用方法

    我们可以在类中定义一个函数,返回私有成员变量的地址,然后通过指针来访问该成员变量。例如,在上面的代码中,我们定义了 `getXY` 函数,返回私有成员变量 `x` 和 `y` 的地址,然后在 `main` 函数中使用指针来访问...

    面向对象程序语言设计第9章编程题

    私有变量的使用是为了封装,确保数据只能通过类提供的公共方法(访问器方法)进行访问和修改,从而保护数据的安全性。 `Fan`类提供了以下访问器方法: - `getSpeed()`:获取风扇当前的速度。 - `setSpeed(int speed...

Global site tag (gtag.js) - Google Analytics