C++访问Private,Protecd,const修改值的一些方法总结

前言

在编写C++程序中 我们偶尔会碰到这样的三种特殊修改变量值的需求:

[1]在不修改类原本的实现下,访问修改类的Private变量

[2]在不修改类原本的实现下,修改类的Protected变量

Private变量访问

public类模版函数特化

这种办法利用了类模版函数特化来实现,如下所示:

比如下面一个类

class TestA
{
public:
    template<typename DataType>
    void Print(DataType Data)
    {
        printf("1111111111111111");
    }

private:
    int a;
    string c;
};

上面一个类所有变量都是Private, 并且存在一个Public模版函数, 这时候就可以通过模版函数特化来进一步访问。

// 通过模版特化实现修改 TestA的a和c变量的函数
struct SetValueParam
{
    int a;
    string c;
};


template<>
void TestA::Print(SetValueParam param)
{
    a = param.a;
    c = param.c;

    printf("a = %d, c = %s\n", a, c.c_str());
}


int main()
{
    SetValueParam param{ 1, "Test" };
    TestA testA;
    testA.Print(param);
    std::cout << "Hello World!\n";
}

这种访问Private办法最大的限制是类本身得存在Public模版函数.

Protected变量访问

Protected变量访问比较常用的一种方法是用过定义母类方法来访问。

class TestB
{
protected:
    int a = 10;
    string c = "aaaa";
};


class AccessClassB_a : public TestB
{
public:

    int GetA()
    {
        return a;
    }
};

int main()
{
    TestB testb;
    AccessClassB_a* classBptr = (AccessClassB_a*)(&testb);
    printf("a = %d\n", classBptr->GetA());
    std::cout << "Hello World!\n";
}

在 博主Yaksue的C++ 在外部访问对象的protected成员的方法_c++对象可以方位protect成员吗-CSDN博客

有段宏代码可以快速定义访问具体某个类的某个Proteced变量的代码,比较好用, 推荐进这篇博客里拷贝使用.

const函数修改类变量--const_cast

经常碰到这样的需求,在某种特定情况下, 在类const函数要修改类的值., 但语法会报错来阻止修改。 可以采用const_cast来去掉const类型对变量的修饰,得到正常的非const对象指针,进而达到修改类值的目的。

#include <iostream>
#include <string>
using namespace std;


class A
{
private:
    int a = 1;

public:
    void Test() const
    {
        A* aPtr = const_cast<A*>(this);

        aPtr->a = 3;
    }

    void Log()
    {
        printf("a = %d\n", a);
    }

};

int main()
{

    A aa;
    aa.Log();

    aa.Test();

    aa.Log();
  
}

资料参考

[1] C++ 在外部访问对象的protected成员的方法_c++对象可以方位protect成员吗-CSDN博客

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值