或许很多人看了我这个标题,很想打我:类的变量都私有了。你访问个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() );
搞定收工。
注意:此法比较卑鄙,未成年人请勿模仿。
分享到:
相关推荐
这样,我们就可以确保在任何时候只有一个线程能访问受保护的资源。 在描述中提到的源码中,ThreadA和ThreadB可能是两个继承自QThread的类。这两个类可能都有自己的run()函数,这是Qt线程执行的主要入口点。每个线程...
这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以避免编译错误和设计上的问题。下面我们将深入探讨这个主题。 首先,我们要理解C++中的“包含...
这样,调用者可以通过`View`对象间接访问变量,而不是直接访问类的内部。 4. **使用回调函数**:`View`类可以接受一个回调函数,当需要更新变量时,调用这个函数。这使得其他类能够参与`View`的变量更新过程,而不...
`public` 是一个访问控制修饰符,它表示该成员变量或方法可以被任何地方访问,无论是类内部还是外部,甚至是继承自该类的子类。这种开放性的设计使得数据和方法易于访问,但也可能导致程序的不安全性增加。 例如,...
Java中的构造函数默认会有一个无参构造函数,除非程序员明确声明。 3. **静态变量**:C++和Java都支持静态变量,但C++中的静态成员属于类本身,而非类的每个实例,而在Java中,静态变量也适用于类的所有实例。 4. ...
// 另一个类中访问公有变量 MyClass obj = new MyClass(); Console.WriteLine(obj.PublicVar); // 输出10 obj.PublicVar = 20; // 修改公有变量的值 ``` **私有变量(private)** 与公有变量相反,私有变量只能在...
实例化一个类意味着创建了一个对象,这个对象可以访问类中定义的非静态成员。 2. **抽象类**:抽象类是含有至少一个抽象方法的类。抽象方法只有方法签名,没有具体实现。抽象类不能被实例化,它们通常作为其他类的...
当一个变量被声明为public,它可以在程序的任何地方被访问,包括同一个类的不同实例、子类以及不同类的实例。这使得公共变量成为实现多类访问的基础。下面将详细阐述C#中的公共变量以及如何在多类间进行访问。 首先...
为避免这种情况,我们需要同步机制,如互斥量(mutex)、临界区(critical section)或信号量(semaphore),来确保一次只有一个线程能访问该全局变量。 在MFC框架中,我们可以使用`CSingleLock`或`CMultiLock`类来...
8. **静态导入(Static Import)**:Java允许静态导入一个类的所有静态成员,这样就可以在不指定类名的情况下直接使用它们,但应谨慎使用,以避免代码的可读性问题。 9. **包(Packages)**:Java通过包来组织类,...
- `private`修饰的变量只能在定义它的类内部访问,不能被同一个包内的其他类或不同包的类访问。这是最低级别的访问权限,用于保护数据的安全性和实现封装。 - `private`变量通常作为类的内部状态,不希望外部代码...
`@public` 访问修饰符表示最高的访问级别,允许任何地方的代码访问该成员,无论是同一个类、子类还是其他任何外部类。当你希望一个变量或方法可以被广泛应用或跨类共享时,通常会将其声明为 `@public`。例如: ``...
例如,如果在类`pub`中有一个`_name`变量,尽管可以使用`a._name`来访问它,但这样做可能会破坏类的封装性,因为这并不是设计的初衷。 2. 双下划线`__xx`: 使用双下划线定义的变量`__info`是私有类型的变量,它们...
声明一个类时,在class关键字后面加上类的名称,这样就创建了一个类,然后在类的里面定义成员变量和方法。 类的访问控制符有四种:默认模式、private、私有、public、公有、protected、保护。Java提供了一系列的...
根据给定的信息,我们将深入探讨如何定义一个`Card`类来表示扑克牌,并且实现相关的功能,例如构造方法、获取牌面和花色的方法以及重写的`toString()`方法。此外,我们还将简要讨论如何利用这个`Card`类来生成一副...
5. 友元函数和友元类:可以访问类的私有和保护成员,增强类之间的交互。尽管不是成员函数,但它们与类的关系密切。 三、访问控制与封装 封装是面向对象编程的关键原则之一,通过设置适当的访问权限,确保数据的安全...
我们可以在类中定义一个函数,返回私有成员变量的地址,然后通过指针来访问该成员变量。例如,在上面的代码中,我们定义了 `getXY` 函数,返回私有成员变量 `x` 和 `y` 的地址,然后在 `main` 函数中使用指针来访问...
私有变量的使用是为了封装,确保数据只能通过类提供的公共方法(访问器方法)进行访问和修改,从而保护数据的安全性。 `Fan`类提供了以下访问器方法: - `getSpeed()`:获取风扇当前的速度。 - `setSpeed(int speed...