C语言实现C++对象和私有成员

C语言实现C++对象和私有成员

C语言实现C++对象

类是C++中面向对象编程思想中比较重要的组成部分,与结构体一样类只是一个模板只有在创建对象时才会申请内存空间,类其实是把具有共同特性的数据或方法(面向对象编程中,一般把函数称为方法)都放在一起,用于创建对象时使用

#include <stdio.h>
#include <malloc.h>

typedef struct _myclass
{
	int a;
	int b;
	int(*max)(int c, int d);
	int(*min)(int c, int d);
	int(*addab)(struct _myclass *t);
} myclass;

int mbmax(int a, int b) {
	return (a > b ? a : b);
}
int mbmin(int a, int b) {
	return (b < a ? b : a);
}

int mbaddab(myclass *t) {
	return t->a + t->b;
}

//相当于C++的类构造函数,用于创建一个类实例,并初始化这个类 实例 ,构造函数命名采用类名init的方式。
myclass * myclassinit() {
	myclass *t = (myclass  *)malloc(sizeof(myclass));
	t->a = 1;
	t->b = 1;
	t->max = mbmax;
	t->min = mbmin;
	t->addab = mbaddab;
	return t;
}

int main() {
	myclass *tt = myclassinit();  //类的创建方法只要一条语句就可以完成,达到了和C++中new类似的效果
	printf("the max number is %d\n", tt->max(4, 8));
	printf("the min number is %d\n", tt->min(4, 8));
	printf("a plus b is %d\n", tt->addab(tt));

	delete tt;
	tt = nullptr;
	return 0;
}

C语言结构体变量私有化

有人说可以通过设置private使成员变量私有化,但如果这样做那就真的“私有化”了。因为一般结构体都没有成员函数(尽管可以有),因此如果设置成私有,那结构体外的所有函数都无法调用成员变量。其实我们这里说的私有是这些成员变量只能在结构体定义的源文件中使用,而不能被其他源文件使用。
解决方案:将结构体放进源文件中,头文件只放声明
这其实跟C的编译有关,当结构体定义在头文件中时,因为我们主函数所在的源文件(main.cpp)会include这个头文件,而编译时相当于将该头文件的内容直接替换掉inlcude,那么main中或者其他include了该头文件的函数都可以访问结构体成员;但当结构体定义在源文件中时,编译时没有将结构体的定义复制过来,因此结构体成员在main中不可用,但因为在源文件中定义了结构体,因此该源文件下的所有函数均可以访问结构体成员。
obj.h

#pragma once
#ifndef  OBJ_H
#define  OBJ_H

typedef struct Obj Obj;

Obj* create_obj(int id, const char* name);
void release_obj(Obj* &o);

int get_obj_id(const Obj* o);
char* get_obj_name(const Obj* o);
#endif 

obj.cpp

#include "obj.h"
#include <string.h>
#include <stdlib.h>
struct Obj {
	int id;
	char *name;
};

Obj* create_obj(int id, const char* name)
{
	Obj* ret = new Obj();
	if (ret) {
		size_t len = 0;
		ret->id = id;
		len = strlen(name);
		ret->name = new char[len + 1];
		//        ret->name = (char *) name;
		if (ret->name)
		{
			memset(ret->name, 0, len + 1);//内存初始化
			memcpy(ret->name, name, len);//内存赋值
		}
	}
	return ret;
}

void release_obj(Obj* &o)//o为引用变量
{
	if (!o) return;
	delete o->name;//释放内存
	o->name = nullptr;//释放完毕要赋空指针
	delete o;
	o = nullptr;
}

int get_obj_id(const Obj* o)
{
	int ret = 0;
	if (o)ret = o->id;
	return ret;
}
char* get_obj_name(const Obj* o)
{
	char* ret = nullptr;
	if (o)ret = o->name;
	return ret;
}

main.cpp

#include "obj.h"
#include <stdlib.h>
#include <stdio.h>

int main()
{
	Obj *o = nullptr;
	o = create_obj(1, "test1");
	//    printf("id : %d\n", o->id);
	printf("id: %d, name: %s\n", get_obj_id(o), get_obj_name(o));
	release_obj(o);
	printf("id: %d, name: %s\n", get_obj_id(o), get_obj_name(o));
}

在这里插入图片描述
参考:
https://www.cnblogs.com/xiaocheng7/p/9420362.html
https://blog.csdn.net/z13653662052/article/details/89003731
https://blog.csdn.net/guogaoan/article/details/38380695

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种非常常用的计算机编程语言,也是许多程序员的入门语言。但是在编写程序的过程中,难免会出现一些错误。下面我来讲解如何改正C语言程序中的错误。 首先,我们需要学会阅读并理解错误信息。当程序出现错误时,C语言编译器会输出相应的错误信息,我们可以根据错误信息来定位和解决问题。 其次,检查语法错误。语法错误是编程过程中最常见的错误之一。C语言是一种强类型语言,因此在声明变量、赋值、调用函数等地方都需要遵循一定的语法规则。如果程序中存在与语法规则不符的地方,编译器就会报错。在修复语法错误时,需要仔细检查每个字符、标点符号和代码结构,确保其符合语法要求。 还需要检查逻辑错误。逻辑错误是指程序在运行过程中的输出结果与预期不符。例如,程序计算一个数的平方根,但结果却是负数。这时候我们要检查是否在计算平方根之前没有判断数值是否合法,或者计算过程中是否存在除以0的情况等。 最后,进行调试。调试是指逐行或逐块地运行程序,查找可能出错的地方。在调试过程中,可以使用printf语句输出一些中间结果,以确定程序是否按照预期执行。如果在某个地方出现错误,我们可以通过逐个比较变量的值、条件语句的判断结果等方法来找出错误所在。 总之,改正C语言程序中的错误需要耐心和细心,需要从语法、逻辑和调试等多个方面全面考虑。通过不断的学习和实践,我们可以更好地掌握C语言编程,提高自己的编程能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值