前言
在编写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();
}