怎么将C++改成C语言的

沧海1梦 2013-12-10 09:29:05
我有一个程序是C++的,但是老师不允许在程序中使用类,想问问有没有人知道怎么修改程序啊?下个星期要用的,谢谢大家了……
...全文
1186 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
elegant87 2013-12-12
  • 打赏
  • 举报
回复
将类的私有数据成员定义为struct 将成员函数定义为公共的函数。函数对结构体成员进行操作
derekrose 2013-12-12
  • 打赏
  • 举报
回复
我有一个程序是C++的,但是老师不允许在程序中使用类 注意不使用class的c++ 代码 并不是c语言
大奶兔白糖 2013-12-12
  • 打赏
  • 举报
回复
引用 12 楼 cwt19902010 的回复:
引用 10 楼 bijiaoben 的回复:
改了函数声明和定义之后,调用的地方也要改吧?C++成员函数里面有this指针的。除非用全局变量。我以前把一段C++改成过C
你好,能把代码发来我看看具体是怎么修改的么,谢谢了
那是我在第一个公司的时候的一个小工作了,只是一个小的C++解码库而已。一个是因为那是公司的代码,不方便发出来,另一个是我早跳槽了,没有备份,而且年代久远,记不太清了。如果你要是需要的话,可以把你的代码打包发给我,我看看怎么改。
abzhang2 2013-12-12
  • 打赏
  • 举报
回复
简单啊.把类改成结构体,然后类中的函数=>结构体中的函数指针. 例如.

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);
}

ooolinux 2013-12-12
  • 打赏
  • 举报
回复
老师为什么这么要求?
jiandingzhe 2013-12-12
  • 打赏
  • 举报
回复
这并不难,但是麻烦。 基本的思路是这样的:把类写成结构体;把方法写成函数,函数接受一个结构体的指针作为第一个参数。 要注意: 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);
}
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
沧海1梦 2013-12-11
  • 打赏
  • 举报
回复
引用 10 楼 bijiaoben 的回复:
改了函数声明和定义之后,调用的地方也要改吧?C++成员函数里面有this指针的。除非用全局变量。我以前把一段C++改成过C
你好,能把代码发来我看看具体是怎么修改的么,谢谢了
沧海1梦 2013-12-11
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
将数据和函数分开成两部分 数据部分假设叫 struct A 所有原来的非静态函数都有更改 函数签名 原来:xxx aFun( parmlist)==>xxx aFun(A* pA,parmlist) 函数体内所有的原来类成员变量改为:pA->yyy 所有的原来成员函数改为: aFun(pA,....) 你们老师也真是脑袋有问题,如果你的类比较复杂,够你喝一壶的了
唉,马上还有考试,说多了都是泪,谢谢啦……
大奶兔白糖 2013-12-11
  • 打赏
  • 举报
回复
改了函数声明和定义之后,调用的地方也要改吧?C++成员函数里面有this指针的。除非用全局变量。我以前把一段C++改成过C
worldy 2013-12-11
  • 打赏
  • 举报
回复
将数据和函数分开成两部分 数据部分假设叫 struct A 所有原来的非静态函数都有更改 函数签名 原来:xxx aFun( parmlist)==>xxx aFun(A* pA,parmlist) 函数体内所有的原来类成员变量改为:pA->yyy 所有的原来成员函数改为: aFun(pA,....) 你们老师也真是脑袋有问题,如果你的类比较复杂,够你喝一壶的了
沧海1梦 2013-12-11
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
把类除掉啊!用普通函数也是可以的啊! 只是代码量会多一点而已!
谢谢版主了
沧海1梦 2013-12-11
  • 打赏
  • 举报
回复
引用 3 楼 zhouda829829 的回复:
贴出来看看 帮你想想怎么改 这么笼统怎么改
已经附上代码,谢谢了……
沧海1梦 2013-12-11
  • 打赏
  • 举报
回复
#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; } 谢谢大家的回复,比如其中的一个文件是这样的,想问问大家怎么修改,谢谢了……
N_Sev7 2013-12-11
  • 打赏
  • 举报
回复
把class全部替换成struct
max_min_ 2013-12-10
  • 打赏
  • 举报
回复
把类除掉啊!用普通函数也是可以的啊! 只是代码量会多一点而已!
zhouda829829 2013-12-10
  • 打赏
  • 举报
回复
贴出来看看 帮你想想怎么改 这么笼统怎么改
碼上道 2013-12-10
  • 打赏
  • 举报
回复
你得能看懂c++代码
狩狗 2013-12-10
  • 打赏
  • 举报
回复
用結構就好啦,最大分別是結構不能有方法就是啦,

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧