user-0 提问: 怎么将C++改成C语言的

回复:
user: user-1
content: 将类的私有数据成员定义为struct 将成员函数定义为公共的函数。函数对结构体成员进行操作

user: user-2
content: 我有一个程序是C++的，但是老师不允许在程序中使用类  注意不使用class的c++ 代码 并不是c语言

user: user-3
content: 引用 12 楼 cwt19902010 的回复:引用 10 楼 bijiaoben 的回复:改了函数声明和定义之后，调用的地方也要改吧？C++成员函数里面有this指针的。除非用全局变量。我以前把一段C++改成过C你好，能把代码发来我看看具体是怎么修改的么，谢谢了 那是我在第一个公司的时候的一个小工作了，只是一个小的C++解码库而已。一个是因为那是公司的代码，不方便发出来，另一个是我早跳槽了，没有备份，而且年代久远，记不太清了。如果你要是需要的话，可以把你的代码打包发给我，我看看怎么改。

user: user-4
content: 简单啊.把类改成结构体,然后类中的函数=>结构体中的函数指针. 例如.  class CMyTest1 { private:     int m_nTest1; public:     CMyTest1()     {           this->m_nTest1 = 1;           printf("构造函数\n");      }     ~CMyTest()     {           printf("析构函数\n");     }      int OnTest(int nVal)      {            this->m_nTest1 = nVal;            return 1;       } };  /// 改成结构体如下.  typedef struct tag_MyTest {       int m_nTest1;       void (*MyTest)(struct tag_MyTest *pData);       void (*_MyTest)(struct tag_MyTest *pData);       int  (*OnTest)(struct tag_MyTest *pData, int nVal); }MYTEST;  void MY_MyTest1(MYTEST *pData)  {       if(!pData)          return;       pData->m_nTest1 = 1;        printf("构造函数\n");  } void MY__MyTest(MYTEST *pData) {     if(!pData)         return;     printf("析构函数\n");  } int MY_OnTest(MYTEST *pData, int nVal) {      if(!pData)          return 0;      pData->m_nTest1 = nVal;      return 1; }  int MYTEST_Init(MYTEST *pData) {      if(!pData)         return 0;      // 所有函数都要调用.      pData->MyTest = MY_MyTest1;      pData->_MyTest= MY__MyTest;      pData->OnTest = MY_OnTest; }  // 使用如: int main_struct()  //用结构体. {     MYTEST test;      MYTEST_Init(&test); // 每个都必须调用.     test.MyTest(&test); // 模拟构造函数.手动调用.          test.OnTest(&test, 1000); // 函数调用.      test._MyTest(&test); // 模拟析构函数,手动调用.       } int main_class()   // 用类. {       CMyTest1 test;            test.OnTest(1000); }

user: user-5
content: 老师为什么这么要求？

user: user-6
content: 这并不难，但是麻烦。 基本的思路是这样的：把类写成结构体；把方法写成函数，函数接受一个结构体的指针作为第一个参数。 要注意： 1：C++会自动完成一些操作，换成C之后要手工补上。 2：这种简单方法不能解决虚函数的问题。  假设如下简单代码：   class Foo { public:   Foo();   Foo(int value);    ~Foo();    void show();    int member; };  class Bar: Foo { public:     Bar();     ~Bar(); }  Foo::Foo(): member(0) {} Foo::Foo(int value): member(value) {} void Foo::show() { cout<<value<<endl; }     可以写个这样的C：  typedef struct {   int member; } Foo;  typedef struct {   Foo parent; } Bar;  Foo* Foo_new() {   return (Foo*) malloc(sizeof(Foo)); }  void Foo_construct(Foo* self) {   self->member = 0; }  void Foo_construct_with_value(Foo* self, int value) {   self->member = value; }  void Foo_show(Foo* self) {   printf("%d\n",self->member); }  void Foo_destruct(Foo* self) {}  void Foo_release(Foo* self) {   free(self); }  Bar* Bar_new() {   return (Bar*) malloc(sizeof(Bar)); }  void Bar_construct(Bar* self) {   Foo_construct(self->parent); }  void Bar_destruct(Bar* self) {   Foo_destruct(self->parent); }  void Bar_release(Bar* self) {   free(self); }    然后，假设你原来有这样的代码：  void main() {   Foo obj1;   Bar* obj2 = new Bar(); }  现在就得变成这样：  void main() {   Foo obj1;   Foo_construct(&obj1);   Bar* obj2 = Bar_new();   Bar_construct(obj2);    Foo_destruct(&obj1);   Bar_destruct(obj2);   Bar_release(obj2); }

user: user-7
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

user: user-0
content: 引用 10 楼 bijiaoben 的回复:改了函数声明和定义之后，调用的地方也要改吧？C++成员函数里面有this指针的。除非用全局变量。我以前把一段C++改成过C你好，能把代码发来我看看具体是怎么修改的么，谢谢了

user: user-0
content: 引用 9 楼 worldy 的回复:将数据和函数分开成两部分 数据部分假设叫 struct A  所有原来的非静态函数都有更改 函数签名 原来：xxx aFun( parmlist)==>xxx aFun(A* pA,parmlist) 函数体内所有的原来类成员变量改为：pA->yyy 所有的原来成员函数改为: aFun(pA,....)  你们老师也真是脑袋有问题，如果你的类比较复杂，够你喝一壶的了唉，马上还有考试，说多了都是泪，谢谢啦……

user: user-3
content: 改了函数声明和定义之后，调用的地方也要改吧？C++成员函数里面有this指针的。除非用全局变量。我以前把一段C++改成过C

user: user-8
content: 将数据和函数分开成两部分 数据部分假设叫 struct A  所有原来的非静态函数都有更改 函数签名 原来：xxx aFun( parmlist)==>xxx aFun(A* pA,parmlist) 函数体内所有的原来类成员变量改为：pA->yyy 所有的原来成员函数改为: aFun(pA,....)  你们老师也真是脑袋有问题，如果你的类比较复杂，够你喝一壶的了

user: user-0
content: 引用 4 楼 max_min_ 的回复:把类除掉啊！用普通函数也是可以的啊！ 只是代码量会多一点而已！谢谢版主了

user: user-0
content: 引用 3 楼 zhouda829829 的回复:贴出来看看 帮你想想怎么改 这么笼统怎么改已经附上代码，谢谢了……

user: user-0
content: #include "Car.h"  ////////////////////////////////////////////////////////////////////// // Construction/Destruction //////////////////////////////////////////////////////////////////////  //赛车宽、长：51 133  CCar::CCar() {  }  CCar::~CCar() {  }  /**  * @brief CCar::LoadImage 加载赛车图片 *  * Detailed description.通过参数加载赛车图片 * @param[in] img 传入的赛车图片(IplImage*)类型 */ void CCar::LoadImage(IplImage *img) { 	m_pImg = img; }   /**  * @brief CCar::CopyToBack 把赛车图片贴到背景图片上 *  * Detailed description.获取赛车图片，并把赛车图片贴到背景图片上 * @param[in] backImage 传入的背景图片 */ void CCar::CopyToBack(IplImage *backImage) { 	int i,j,b,g,r; 	int x = m_pos.x; 	int y = m_pos.y; 	for(i = 0 ; i < m_pImg->height; ++i) 	{ 		for(j = 0;j < m_pImg->width; ++j) 		{ 			/** @brief  通过使用宏CV_IMAGE_ELEM，获取三通道像素值*/             b = CV_IMAGE_ELEM(m_pImg,uchar,i,j * 3 + 0);             g = CV_IMAGE_ELEM(m_pImg,uchar,i,j * 3 + 1); 			r = CV_IMAGE_ELEM(m_pImg,uchar,i,j * 3 + 2); 			              if(!(b >= 250 && g >= 250 && r >= 250)) 			{  				CV_IMAGE_ELEM(backImage,uchar,i + y,(j + x) * 3 + 0) = b; 				 				CV_IMAGE_ELEM(backImage,uchar,i + y,(j + x) * 3 + 1) = g;  				 				CV_IMAGE_ELEM(backImage,uchar,i + y,(j + x) * 3 + 2) = r; 			} 		} 	} }  /**  * @brief CCar::InitPos 初始化赛车位置 *  * Detailed description.通过传入的CvPoint类型数据pos,初始化赛车位置 * @param[in] pos 赛车的位置坐标 */ void CCar::InitPos(CvPoint pos) { 	m_pos.x = pos.x; 	m_pos.y = pos.y; }  /**  * @brief CCar::RunLeftRight 控制让赛车左右偏移 *  * Detailed description.用键盘控制，让赛车左右偏移  同时把赛车限制在赛道中部； * @param[in] leftOrRight 参数为'a'、'A'赛车向左偏移，参数为'd'、'D'赛车向左偏移; */ void CCar::RunLeftRight(char leftOrRight) { 	switch (leftOrRight) 	{ 	case 'a': 	case 'A':if(m_pos.x >= 150)m_pos.x -= 15;break; 	case 'd': 	case 'D':if(m_pos.x <= 750)m_pos.x += 15;break; 	} }  /**  * @brief CCar::RunOnLine 赛车可沿直线方向移动 *  * Detailed description.用键盘控制，让赛车上下移动  同时把赛车限制在屏幕内; * @param[in] lineMove 参数为'w'、'W'赛车向上移动，参数为's'、'S'赛车向下移动。 */ void CCar::RunOnLine(char lineMove) { 	switch (lineMove) 	{ 	case 'w': 	case 'W':if(m_pos.y >= 1)m_pos.y -= 8;break;//速度有最大值if(m_speed <= -9)m_speed = -9; 	case 's': 	case 'S':if(m_pos.y <= 500)m_pos.y += 8;break;//速度最小为if(m_speed < 0)0; 	} }   /**  * @brief CCar::InitSpeed 初始化赛车速度 *  * Detailed description.初始化赛车速度 * @param[in] _speed 整形参数_speed 为初始化的赛车速度 */ void CCar::InitSpeed(int _speed) { 	m_speed = _speed; } /**  * @brief CCar::InitSize 初始化赛车大小 *  * Detailed description.初始化赛车大小 * @param[in] width 赛车的宽带 * @param[in] height 赛车的高度 */ void CCar::InitSize(int width, int height) { 	m_size.width = width; 	m_size.height = height; }   /**  * @brief CCar::InitScore 初始化分数 *  * Detailed description.初始化分数 * @param[in] score 整形参数score为初始化的分数 */ void CCar::InitScore(int score) { 	m_score = score; } 谢谢大家的回复，比如其中的一个文件是这样的，想问问大家怎么修改，谢谢了……

user: user-9
content: 把class全部替换成struct

user: user-10
content: 把类除掉啊！用普通函数也是可以的啊！ 只是代码量会多一点而已！

user: user-11
content: 贴出来看看 帮你想想怎么改 这么笼统怎么改

user: user-12
content: 你得能看懂c++代码

user: user-13
content: 用結構就好啦,最大分別是結構不能有方法就是啦,