【c++】结构体创意设计 Data (数据隐藏技术)与伪值

初始代码:

#include <iostream>

struct Data{
    
    int num;
    
    int *p;
    
    int getNum(){
        
        
        return num;
    }
    
    int getChildrenData(int num_){
        
        if(num_ == num){
            return *p;
        }else{
            return -1;
        }
        
        
    }
    
};

int main() {
    
    int aaa = 40;
    
    int * p = &aaa;
    
    Data s = {3,p};
    
    std::cout <<s.getNum() << std::endl;
    
    //只有第一个参数正确时,才能访问到第二个指针所指向的值
    std::cout <<s.getChildrenData(3) << std::endl;
    
    return 0;
}

可能得用途:

1. 简单的键值对模拟

尽管这不是一个标准的键值对实现(通常使用 std::map 或 std::unordered_map),但 Data 结构体可以模拟一个简单的情况,其中 num 可以视为键(key),而 p 指向的整型值可以视为与该键相关联的值(value)。不过,这种实现方式非常有限,因为它只允许存储单个键值对,并且没有提供修改值或添加新键值对的功能。

2. 父子关系或特定条件的数据访问

在你的 getChildrenData(int num_) 函数中,如果传入的 num_ 与结构体内部的 num 相等,则函数返回通过 p 指针访问的值。这可以模拟一种场景,其中 Data 实例代表某个对象,而该对象可能有一个与之关联的特定值(通过 p 指向),这个值只在特定条件下(即 num_ 等于 num)才可访问。这可以用于表示具有特定条件或权限才能访问的数据。

3. 链表节点

虽然 Data 结构体本身没有直接实现链表的功能(例如,没有指向下一个节点的指针),但你可以通过修改它来作为链表节点的基础。在这种情况下,p 指针可以指向链表中的下一个 Data 节点,而 num 可以存储节点的数据或用于其他目的(如作为链表中的索引或某种标识)。

4. 自定义数据结构的一部分

Data 结构体可以作为更复杂数据结构(如自定义的数据库表行、图论中的节点、或任何需要同时存储数据和指针的场景)的一部分。在这种情况下,num 和 p 指针可以根据特定需求具有不同的含义和用途。

5. 示例和测试

最后,你提供的代码也可以作为学习 C++ 结构体、指针和成员函数使用的一个简单示例。通过运行和修改这个示例,可以加深对 C++ 编程语言中这些概念的理解。

总的来说,虽然 Data 结构体本身看起来可能用途有限,但它可以作为构建更复杂和有用数据结构的基础。根据你的具体需求,你可以调整这个结构体的设计,以满足你的应用场景。

一个看起来简单的函数,越能改造的高级,改造方向也比较广,我就把这个特性称为函数的“可塑性”

函数可塑性:

一个函数或结构的“可塑性”是指它能够被改造、扩展或应用于多种不同场景和目的的能力。一个具有高可塑性的函数通常具备以下特点:

  1. 参数化:函数接受参数,这些参数可以影响函数的行为或结果。通过改变参数,可以使函数适应不同的输入或情境。

  2. 抽象化:函数的功能被抽象为处理一类问题的方法,而不是具体的数据或场景。这使得函数可以轻松地与不同的数据类型或场景结合使用。

  3. 可扩展性:函数可以被轻松地扩展或修改以包含额外的功能。这可能通过添加新的参数、条件语句、循环或调用其他函数来实现。

  4. 模块化:函数是独立的代码块,可以轻松地与其他代码块组合在一起,形成更复杂的系统。这种模块化特性使得函数可以在不同的项目中重复使用,而无需进行大量修改。

  5. 泛化:函数可以被设计为处理更一般化的问题,而不仅仅是特定的情况。通过使用泛型编程技术(如C++中的模板或Python中的泛型函数),函数可以处理多种类型的数据,从而进一步提高其可塑性。

  6. 回调和钩子:函数可以设计为接受其他函数作为参数(回调)或在特定点执行其他函数(钩子)。这使得函数的行为可以在不修改其内部代码的情况下被定制或扩展。

  7. 多态性:在面向对象编程中,通过继承和接口实现多态性,可以使函数能够处理不同类型的对象,而无需为每个类型编写单独的函数。

  8. 组合与装饰:函数可以被设计为易于与其他函数组合或装饰(即在不修改原函数代码的情况下增加额外的功能)。这可以通过函数式编程中的高阶函数、组合子和装饰器等概念来实现。

通过提高函数的可塑性,开发者可以更加灵活和高效地构建和维护软件系统。他们可以快速响应变化的需求,通过修改或扩展现有函数来适应新的场景,而不是从头开始编写全新的代码。这种能力对于构建可维护、可扩展和可复用的软件系统至关重要。

这个data类也可以对数据进行 封装 隐藏 加密(实际上是一种伪值的作用)表面值只是一个假值

虽然你最初定义的 Data 类并没有直接实现封装、隐藏或加密数据的功能,但你可以通过修改这个类来增加这些特性。这里,我将分别解释如何在这个类的基础上实现数据的封装、隐藏和一种简单的“伪值”或“伪装”机制。

封装

封装是指将数据(属性)和作用于数据的操作(方法)捆绑在一起,形成一个整体(类)。在这个类中,你已经做到了基本的封装,因为 num 和 p 都被定义在 Data 类的内部,并且只能通过类的方法(如 getNum() 和 getChildrenData(int num_))来访问。

隐藏

隐藏通常指的是从类的外部隐藏类的内部实现细节,只提供有限的接口(即公有方法)来与外部世界交互。在你的 Data 类中,num 和 p 成员变量是私有的(尽管在C++中它们默认为私有,但在其他语言中可能需要显式声明为 private),这已经是隐藏的一种形式。外部代码不能直接访问这些变量,只能通过类提供的方法来进行访问和修改(尽管在这个例子中,p 实际上是通过构造函数直接赋值的,但你可以添加一个设置器(setter)方法来控制对 p 的赋值)。

加密或伪值

加密通常指的是使用加密算法来保护数据的机密性,使得未经授权的用户无法轻易地获取数据的原始值。然而,在你的 Data 类中直接实现加密可能不是最直接的用途,因为加密通常涉及更复杂的算法和库。不过,你可以实现一种“伪值”或“伪装”机制,使得从外部看到的值不是数据的实际值。

这里有一个简单的示例,说明如何为 num 成员变量添加一个“伪值”功能:

 
cpp#include <iostream>

struct Data {
private:
int realNum; // 实际值
int num; // 伪值,对外展示的值
int *p;

public:
Data(int real, int pseudo, int *ptr) : realNum(real), num(pseudo), p(ptr) {}

int getNum() {
// 返回伪值
return num;
}

int getRealNum() {
// 提供一个特殊的方法来获取实际值(可能需要权限控制)
return realNum;
}

int getChildrenData(int num_) {
if (num_ == this->num) { // 注意这里使用伪值进行比较
return *p;
} else {
return -1;
}
}
};

int main() {
int aaa = 40;
int *p = &aaa;
Data s = {3, 5, p}; // 实际值为3,伪值为5

std::cout << "伪值: " << s.getNum() << std::endl;
std::cout << "实际值: " << s.getRealNum() << std::endl;
std::cout << "Children Data: " << s.getChildrenData(5) << std::endl; // 使用伪值访问

return 0;
}

在这个例子中,Data 类包含了一个实际值 realNum 和一个伪值 num。外部代码通常只能访问到伪值,而实际值则需要通过特定的方法(如 getRealNum())来获取。这可以看作是一种简单的数据伪装机制。然而,请注意,这种机制并不提供真正的安全性,因为任何有权访问类内部的人都可以绕过伪值来访问实际值。如果需要真正的数据保护,你应该考虑使用加密技术。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天若有情673

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值