使用Eclipse C / C ++开发工具包开发应用程序

本文是“ 使用Eclipse平台进行C / C ++开发 ”的后续文章,适用于希望使用Eclipse CDT学习C ++开发的C ++开发人员。 本文开发了一个简单的C ++应用程序。 该应用程序使用C ++ STL。 读者应该熟悉STL以及基本的面向对象的编程原理,例如继承和多态性。 熟悉Eclipse会有所帮助,但不是必需的。

开始之前

您需要安装以下内容:

  • 我们正在使用CDT,它是Eclipse的插件,因此您当然需要Eclipse。 本文使用Eclipse V3.2。

  • Java运行时环境

    我们正在构建C ++应用程序,但正在使用Eclipse。 Eclipse本身就是Java应用程序,因此需要Java运行时环境(JRE)。 本文使用Eclipse V3.2,它要求JRE为V1.4或更高。 如果您还希望将Eclipse用于Java开发,则需要一个Java Development Kit(JDK)。

  • Eclipse C / C ++开发工具箱(CDT)

    本文是关于CDT的,因此您当然需要它。 有关在早期版本的Eclipse上安装CDT的说明,请阅读“ 使用Eclipse平台进行C / C ++开发 ”(developerWorks 2003)。

  • 西格温

    如果您使用的是MicrosoftWindows®,您会发现Cygwin(在Windows上提供类似Linux®的环境)很有帮助。

  • GNU C / C ++开发工具

    CDT使用标准的GNU C / C ++工具来编译代码,构建项目和调试应用程序。 这些工具是用于C ++(g ++),make的GNU编译器集合(GCC)和GNU项目调试器(GDB)。 如果您是使用Linux或Mac OS X的程序员,则很有可能在您的计算机上安装了这些工具。 本文包含有关为Windows设置这些工具的说明。

Eclipse CDT

Eclipse CDT是一个Eclipse插件,可以将Eclipse转换为功能强大的C / C ++ IDE。 它旨在将Java开发人员享有的Eclipse的许多出色功能带给C / C ++开发人员,例如项目管理,集成调试,类向导,自动构建,语法着色和代码完成。 当Eclipse用作Java IDE时,它将利用JDK并与之集成。 同样,CDT利用和集成了标准C / C ++工具,例如g ++,make和GDB。 这导致它在Linux上变得非常流行,在Linux上这些工具随时可用并用于大多数C ++开发。 可以在Windows上将CDT设置为使用相同的工具。 还正在努力使CDT与Microsoft的C ++工具一起使用,以使其对Windows C ++开发人员更具吸引力。

安装CDT

我们首先假设您已经安装了Eclipse并且可以运行它。 如果没有,请查阅Eclipse的网站以启动和运行。 让我们安装CDT。 CDT是Eclipse插件,因此它使用Eclipse的软件更新功能。 选择帮助>软件更新>查找并安装

图1. Eclipse软件更新
Eclipse软件更新

接下来,您将选择“ 搜索要安装的新功能”。

图2.搜索新功能
搜索新功能

如果您使用的是Eclipse的较新版本,则应包括Callisto或Europa发现站点。 (编者注:自编写于2007年4月以来,Europa发行版仍处于计划阶段。但是,预期安装Europa类似于Callisto。)只需选择它,然后单击Finish

图3. Callisto发现站点
卡里斯托发现网站

Eclipse可能会要求您从Callisto Discovery Site的镜像站点列表中选择。 选择最接近您的人。 您应该从Callisto Discovery Site中看到插件列表。 您将要选择C and C ++ Development并单击Next

图4.可用的Callisto插件
可用的Callisto插件

系统会要求您接受CDT的许可证。 完成此操作后,可以单击下一步 。 您将看到将要下载和安装的摘​​要。 只需单击“ 完成”

图5.下载和安装摘要
下载和安装摘要

然后,Eclipse的Update Manager将从您先前选择的镜像站点下载CDT插件。 CDT总共约为11 MB,因此这可能需要几分钟,具体取决于您的Internet连接速度。 下载所有内容后,系统将要求您确认要安装新功能。 单击全部安装

图6.确认安装
确认安装

完成CDT的安装后,将要求您重新启动Eclipse。 继续做吧。 Eclipse重新启动后,CDT将准备就绪。

Windows配置

如果您正在Linux或Mac OS X上运行Eclipse,则可以开始使用CDT来开发C ++应用程序了。 如果您使用的是Windows,则可能还有更多步骤。 如前所述,CDT依赖于标准的GNU C ++开发工具:g ++,make和GDB。 这些通常包含在Linux或Mac OS X中。通常不包含在Windows中。 但是不用担心。 这些工具可以轻松地安装在Windows上。 也许最简单的方法是安装Cygwin。 Cygwin在Windows上提供了类似Linux的环境(请参阅参考资料 )。 在安装Cygwin时,系统会要求您选择要安装的软件包。 确保进入“开发”部分并选择gcc:g ++,make和GDB。 这也将导致其先决条件也被安装。

安装完Cygwin之后,您需要将g ++,make和GDB添加到您的路径中。 最简单的方法是将Cygwin的bin目录添加到路径中,因为可以在其中找到g ++,make和GDB。 完成后,重新启动Eclipse。

玩彩票

此时,我们应该准备开始使用CDT开发应用程序。 让我们停下来弄清楚我们要开发什么。 该示例应用程序是一个用于生成彩票号码的简单命令行程序。 许多州都有彩票,规则也相差很大。 我们将允许用户选择他要为其生成数字的州彩票。 这将为我们提供一种使用C ++对多态行为的支持的好方法。

创建项目

Eclipse使用透视图的概念来允许各种插件来自定义其命令和视图。 在Java透视图中,Eclipse默认情况下启动。 CDT包含自己的观点,因此我们将转向这一观点。 为此,请选择“ 窗口”>“打开透视图”>“其他” 。 您应该看到可用的观点列表。 选择C / C ++透视图,然后单击OK

图7.选择C / C ++透视图
选择C / C ++透视图

Eclipse现在看起来应该如图8所示。

图8. C / C ++透视图
C / C ++观点

Eclipse将您的代码组织到项目中,因此我们要创建一个新项目。 选择文件>新建>托管Make C ++项目

图9.新的C ++项目
新的C ++项目

您可能已经注意到该项目有几种不同的选择。 我们想要一个C ++项目。 我们选择了“ Managed Make”,因为这将允许Eclipse为我们创建make文件。 您可以选择“标准制作”样式并编写自己的制作文件。 现在,我们应该在“新建项目”向导中,在这里将我们的项目命名为“ 彩票” ,然后单击“ 完成”

这将创建一个空项目,您应该在“ C / C ++项目”窗口中看到该项目。 右键单击项目,然后选择“ 新建”>“源文件夹” 。 这将打开“ New Source Folder”向导,在这里我们将文件夹命名为src并单击Finish

基本彩票

我们准备开始创建一些代码。 我们将从创建应用程序的可执行文件开始。 右键单击我们刚刚创建的源文件夹,然后选择New> Source File ,如图10所示。

现在让我们创建一个空的main方法。 这只是一个占位符; 在创建完项目的其余部分后,我们将为此添加更多内容。

int main()
{
     return 0;
}

保存您的项目,Eclipse将自动为您创建项目。 您应该在控制台中看到一些输出,表明它已成功编译。

我们已经准备好创建一流的课程。 右键单击我们刚刚创建的源文件夹,然后选择New> Class

图10.新类
新班

这将打开“新建类”向导。 我们将给我们的班级一个名称空间乐透 ,并将我们称为班级Lottery

图11.彩票类
彩票类

Eclipse现在将为您的课程创建存根。 CDT为您做了很多美好的事情。 它在头文件中生成适当的编译器指令。 它通过生成单独的接口(Lottery.h)和实现(Lottery.cpp)文件来鼓励最佳实践。 通过将您的类的析构函数虚拟化,可以鼓励另一种最佳实践。 我们可以输入这些类的源代码,如清单1和清单2所示。

清单1. Lottery.h
#ifndef LOTTERY_H_
#define LOTTERY_H_
#include <string>
#include <sstream>
#include <cstdlib>
#include <time.h>
using namespace std;
namespace lotto
{

class Lottery
{
     protected:
          int ticketSize, maxNum;
          int* generateNumbers();
public:
     Lottery(int,int);
     virtual ~Lottery();
     virtual string printTicket();
};

}

#endif /*LOTTERY_H_*/

清单2显示了Lottery类的实现文件。

清单2. Lottery.cpp
#include "Lottery.h"

namespace lotto
{

Lottery::Lottery(int size, int num)
{
     this->ticketSize = size;
     this->maxNum = num;
}

Lottery::~Lottery()
{
}

int* Lottery::generateNumbers()
{
     int* allNums = new int[this->maxNum +1];
     for (int i=0; i <= this->maxNum ; i++)
     {
          allNums[i] = 0;
     }
     int* nums = new int[this->ticketSize];
     for (int i=0; i < this->ticketSize; i++)
     {
          int val = 1 + rand() % (this->maxNum);
          if (allNums[val])
          {
               i--;
          }
          else 
          {
               nums[i] = val;
               allNums[val] =1;
          }
     }
     return nums;
}

string Lottery::printTicket()
{
     ostringstream str;
     int* nums = this->generateNumbers();
     for (int i=0;i< this->ticketSize; i++)
     {
          str << *nums << ' ';
          nums++;
     }
     return str.str();
}

}

这段代码在做什么? 好吧,我们的Lottery类具有两个属性。 ticketSize属性是彩票上的号码数。 maxNum是票证上的最大数目。 稍后,我们将以佛罗里达州彩票为例。 在这里,您从1到53中选择了六个数字,所以ticketSize将为6, maxNum将为53。

generateNumbers方法生成一个与彩票上的数字相对应的数字数组。 它使用STL函数rand()随机生成数字。 allNums数组用于跟踪到目前为止已生成的数字,因此我们可以确保在票证上没有重复的数字。 最后, printTicket()创建我们票证的字符串表示形式。

保存文件时,Eclipse将自动构建您的项目。 同样,如果保存了项目,则应该对其进行编译,并且应该在控制台中看到编译消息,如清单3所示。

清单3.控制台中的编译器输出
**** Build of configuration Debug for project Lottery ****

make -k all 
Building file: ../src/Main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Main.d" -MT"src/Main.d" 
-o"src/Main.o" "../src/Main.cpp"
Finished building: ../src/Main.cpp
 
Building target: Lottery
Invoking: MacOS X C++ Linker
g++  -o "Lottery"  ./src/Lottery.o ./src/Main.o   
Finished building target: Lottery
 
Build complete for project Lottery

MegaLottery

您可能已经注意到,当在头文件中声明printTicket()方法时,我们将其虚拟化了。 这将使我们能够继承Lottery并重写此方法。 我们之所以想这样做,是因为有些州的彩票带有“大”数字。 这是一个单独抽取的号码,除其他抽取的号码外,任何票证都必须匹配。 让我们为这些州创建一个MegaLottery类,该类将把Lottery子类化。

再次右键单击源文件夹,然后选择新建>类 ,就像我们之前所做的那样。 这次在“新建类”向导中,我们将在相同的名称空间中声明新类,但将其MegaLottery

图12. MegaLottery
超级彩票类

要对Lottery ,请选择基本类别部分旁边的添加按钮。 这将弹出“选择基础类”对话框。 您可以开始输入类的名称,然后Eclipse将Swift缩小基类候选者的列表。 您需要选择彩票,然后单击确定

图13.选择基类
选择基类

我们可以输入MegaLottery的代码,如清单4和5所示。

清单4. MegaLottery.h
#ifndef MEGALOTTERY_H_
#define MEGALOTTERY_H_

#include "Lottery.h"

using std::string;

namespace lotto
{

class MegaLottery : public lotto::Lottery
{
     protected:
          int maxMegaNum;
public:
     MegaLottery(int,int,int);
     virtual ~MegaLottery();
     string printTicket();
};

}

#endif /*MEGALOTTERY_H_*/

清单5显示了MegaLottery类的实现文件。

清单5. MegaLottery.cpp
#include "MegaLottery.h"

using namespace std;

namespace lotto
{

MegaLottery::MegaLottery(int ticketSize, int maxNum, int maxMegaNum) : 
    Lottery(ticketSize,maxNum)
{
     this->maxMegaNum = maxMegaNum;
}

MegaLottery::~MegaLottery()
{
}

string MegaLottery::printTicket()
{
     ostringstream tick;
     tick << Lottery::printTicket() << " Mega: ";
     int mega = 1 + rand() % this->maxMegaNum;
     tick << mega;
     return tick.str();
}

}

LotteryMegaLottery之间的主要区别在于MegaLottery具有额外的属性maxMegaNum 。 这是兆位数可以采用的最大值。 它覆盖了printTicket()方法。 它使用基类生成票证的第一部分,然后生成兆号并将其附加到票证的字符串表示形式。

我们只需要一种方法来创建各种彩票。 我们将使用类Factory Pattern来执行此操作。 我们将通过添加LotteryFactory类来做到这一点。 我们希望所有Lotteries都来自同一家工厂,因此我们将使LotteryFactory单身。 清单6和清单7是其代码。

清单6. #ifndef LOTTERYFACTORY_H_
#define LOTTERYFACTORY_H_

#include "Lottery.h"

namespace lotto
{

class LotteryFactory
{
    
public:
    enum State { California, Florida };
    static LotteryFactory* getInstance();
    Lottery* getLottery(State);
private:    
    LotteryFactory();
};

}

#endif /*LOTTERYFACTORY_H_*/

清单7显示了LotteryFactory类的实现文件。

清单7. LotteryFactory.cpp
#include "LotteryFactory.h"
#include "MegaLottery.h"

namespace lotto
{

LotteryFactory::LotteryFactory()
{
    srand(time(NULL));
}

Lottery* LotteryFactory::getLottery(State s)
{
    if (s == LotteryFactory::California)
    {
        Lottery* lotto = new MegaLottery(5,47,27);
        return lotto;
    }
    else 
    {
        Lottery* lotto = new Lottery(6,53);
        return lotto;
    }
}

LotteryFactory* LotteryFactory::getInstance()
{
    static LotteryFactory instance;
    return &instance;
}

}

LotteryFactory有一个不同类型的彩票的枚举。 我们仅在示例中放入了佛罗里达州和加利福尼亚州,但添加所需数量并不难。 LotteryFactory的构造函数为我们的彩票类使用的rand()函数LotteryFactory种子。 我们只需要实现可执行文件的main方法。

清单8. Main.cpp
#include <iostream>
#include "LotteryFactory.h"

using namespace lotto;
int main()
{
    LotteryFactory* factory = LotteryFactory::getInstance();
    cout << "What lottery do you want to play?" << endl;
    cout << "(1) California, (2) Florida" << endl;
    int cmd;
    scanf("%d", &cmd);
    Lottery* lotto = 0;
    switch (cmd)
    {
        case 1 :
        lotto = factory->getLottery(LotteryFactory::California);
        break;
        
        case 2 :
        lotto = factory->getLottery(LotteryFactory::Florida);
        break;
        
        default :
        cout << "Sorry didn't understand that" << endl;
    }
    cout << "Ticket: " << lotto->printTicket() << endl;
    delete lotto;
    return 0;
}

运行程序

我们已经准备好运行我们的程序。 选择运行>运行

图14.选择基类
选择基类

选择“ C / C ++本地应用程序”,然后单击“ 新建”按钮。

图15.新的C / C ++运行配置文件
新的C / C ++运行配置文件

这将打开彩票项目的“创建运行”配置界面。 您需要通过单击“ 搜索项目”按钮来选择其可执行文件。

图16.搜索项目以查找可执行文件
搜索项目以查找可执行文件

您可以选择Eclipse为您创建的二进制文件,然后单击OK

图17.搜索项目以查找可执行文件
搜索项目以查找可执行文件

只需单击“运行” ,该程序应在您的控制台中运行。 下面的代码显示了一些示例输出。

What lottery do you want to play?
(1) California, (2) Florida
2
Ticket: 12 28 24 15 35 22

调试程序

我们的程序应该运行良好,但让我们看一下调试应用程序。 首先,在我们的代码中创建一个断点。 选择一条线并在其旁边单击鼠标右键,然后选择“ 切换断点”

图18.创建断点
创建断点

我们需要创建调试配置,就像我们创建运行配置一样。 选择运行>调试

图19.创建调试配置
创建调试配置

这应该调出调试配置。 这是基于“运行”配置的,您不需要更改任何内容。 只需单击Debug即可

图20.调试配置
调试配置

调试器启动后,将提示您切换到“调试器”透视图。 这样做。 请注意,在配置中,我们将事情设置为在main方法启动时自动中断。 因此,调试器应该立即中断,您应该看到类似于图21的屏幕。

图21.调试器
调试器

摘要

我们已经构建并调试了彩票应用程序。 您可以轻松地向其中添加更多彩票方案。 其中一些可能涉及其他子类。 CDT使创建这些类和类层次结构以及运行和调试应用程序以对其进行测试比以往更加容易。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-eclipse-stlcdt/index.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值