Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1904589
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: C/C++

2007-11-07 21:57:26

使用 Eclipse C/C++ Development Toolkit 开发应用程序

使用标准模板库(Standard Template Library)和 CDT 创建 C++ 应用程序

developerWorks
文档选项
将打印机的版面设置成横向打印模式

将此页作为电子邮件发送

将此页作为电子邮件发送

未显示需要 JavaScript 的文档选项



级别: 中级

Michael Galpin (), 软件工程师, Ludi Labs

2007 年 9 月 06 日

提到 “Eclipse”,大多数人都会想到 “Java™ IDE”。与其他 IDE 相比,Eclipse 更多地被提到。使用适当的插件,可以把 Eclipse 与 PHP、Ruby、Groovy、C 和 C++ 结合使用。在本文中,您将开始使用 Eclipse C/C++ Development Toolkit (CDT)。我们将构建一个 C++ 编写的简单应用程序,使用 CDT 和 C++ Standard Template Library (STL) 简化构建过程并且利用 C++ 的一些强大功能。

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

您需要安装以下软件:

我们将使用 Eclipse 的插件 CDT,因此您当然需要使用 Eclipse。本文将使用 Eclipse V3.2。
我们要构建 C++ 应用程序,但是我们将使用 Eclipse。Eclipse 本身是 Java 应用程序,因此它需要使用 Java Runtime Environment (JRE)。本文使用 Eclipse V3.2,它要求使用 JRE V1.4 或更高版本。如果还需要使用 Eclipse 进行 Java 开发,则需要使用 Java Development Kit (JDK)。
本文是 CDT 的介绍性文章,因此当然需要使用 CDT。要获得在早期版本的 Eclipse 中安装 CDT 的说明,阅读 2003 年发表在 developerWorks 中标题为 “用 Eclipse 平台进行 C/C++ 开发” 的文章。
如果要使用 Microsoft Windows®,您将会发现 Cygwin 十分有用,Cygwin 在 Windows 中提供了类似 Linux® 的环境。
GNU C/C++ Development Tools
CDT 将使用标准的 GNU C/C++ 工具编译代码、构建项目和调试应用程序。这些工具包括 GNU Compiler Collection (GCC) for C++ (g++)、make 和 GNU Project Debugger (GDB)。如果您是一名使用 Linux 或 Mac OS X 的程序员,则可以将这些工具安装到计算机上。本文包含针对 Windows 设置这些工具的说明。




回页首


Eclipse CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE。它被设计为将 Java 开发人员喜爱的许多 Eclipse 优秀功能提供给 C/C++ 开发人员,例如项目管理、集成调试、类向导、自动构建、语法着色和代码完成。当 Eclipse 被用作 Java IDE 时,它将利用 JDK 并与之集成。同样地,CDT 将利用标准的 C/C++ 工具并与之集成,例如 g++、make 和 GDB。这使得 CDT 在 Linux 中变得非常流行,这些工具都可在 Linux 中使用并用于大多数 C++ 开发。可以在 Windows 上设置 CDT 以使用相同的工具。目前还在努力将 CDT 与 Microsoft 的 C++ 工具结合使用,以使 CDT 对 Windows C++ 开发人员更有吸引力。





回页首


首先假定您安装了 Eclipse 并可以运行它。如果不能,请访问 Eclipse 的 Web 站点以获得启动和运行说明。让我们来安装 CDT。CDT 是 Eclipse 插件,因此它将使用 Eclipse 的 Software Updates 功能。选择 Help > Software Updates > Find and Install



Eclipse Software Updates

接下来,您将需要选择 Search 以查找要安装的新功能。



搜索新功能

如果使用的是最新版本的 Eclipse,则应当附带了 Callisto 或 Europa 搜索站点。(编者注:由于本文撰写于 2007 年 4 月,因此 Europa 发行版仍处于计划阶段。但是,人们期望安装 Europa 就像安装 Callisto 一样)。只需选中它并单击 Finish



Callisto 搜索站点

Eclipse 可能会要求您从镜像站点列表中选择 Callisto 搜索站点。任选一个看似与您距离最近的镜像站点。您应当会看到来自 Callisto 搜索站点中的插件列表。您将需要选择 C and C++ Development 并单击 Next



可用 Callisto 插件

系统将询问您是否接受 CDT 的许可。完成后,您可以单击 Next。您将看到将要下载和安装软件的摘要。只需单击 Finish



下载和安装摘要

Eclipse 的 Update Manager 随后将从先前选定的镜像站点中下载 CDT 插件。CDT 总共大约 11 MB,因此这可能需要花费一些时间,这取决于 Internet 连接速度。下载所有软件及插件后,系统将要求您确认是否需要安装新功能。单击 Install All



确认安装

安装完 CDT 之后,将要求您重新启动 Eclipse。请重新启动。在 Eclipse 重新启动后,CDT 已经准备就绪。





回页首


如果是在 Linux 或 Mac OS X 上运行 Eclipse,则已经准备好开始使用 CDT 开发 C++ 应用程序。如果是在 Windows 中,则可能还需几个额外步骤。如前述,CDT 依赖于标准的 GNU C++ 开发工具:g++、make 和 GDB。Linux 或 Mac OS X 中通常附带了这些开发工具。Window 则没有。但是不必担心。这些工具都可以轻松地安装到 Windows 中。最简单的方法可能是安装 Cygwin。Cygwin 在 Windows 中提供了类似 Linux 的环境(请参阅 参考资料)。安装 Cygwin 时,将要求您选择需要安装的软件包。确保转到开发部分并选择 gcc:g++、make 和 GDB。这样也将安装这些开发工具的先决条件。

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





回页首


此时,我们应当已经准备好开始用 CDT 开发应用程序。让我们暂停一下来勾勒所需开发的应用程序。样例应用程序是用于生成彩票号码的简单命令行程序。很多州都有彩票,并且规则各异。我们将允许用户选取需要生成哪个州的彩票号码。这将为我们提供一种优秀的方法来使用 C++ 的多态支持。





回页首


Eclipse 将使用透视图的概念以允许各种插件来自定义其命令和视图。默认情况下,Eclipse 将在 Java 透视图中启动。CDT 附带了自己的透视图,因此我们将需要切换到该透视图。为此,请选择 Window > Open Perspective > Other。您应当会看到可用的透视图列表。选择 C/C++ 透视图并单击 OK



选择 C/C++ 透视图

Eclipse 现在应当类似图 8 所示:



C/C++ 透视图

Eclipse 将把代码组织成项目,因此我们需要创建一个新项目。请选择 File > New > Managed Make C++ Project



新建 C++ 项目

您可能已经注意到该项目有几个不同选项。我们需要一个 C++ 项目。选择了 “Managed Make”,因为那将允许 Eclipse 为我们创建 make 文件。您可以选择 “Standard Make” 风格并编写您自己的 make 文件。我们现在应当已经在 New Project 向导中,在其中把项目命名为 Lottery 并单击 Finish

此操作将创建一个空项目,您应当会在 C/C++ Projects 窗口中看到该项目。在项目上右键单击并选择 New > Source Folder。此操作将打开 “New Source Folder” 向导,在其中把文件夹命名为 src 并单击 Finish





回页首


我们已经准备好开始创建一些代码。首先创建应用程序的可执行文件。右键单击刚创建的源文件夹并且选择 New > Source File,如图 10 所示:

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

int main()
{
     return 0;
}

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

我们已经准备好创建第一个类。右键单击刚创建的源文件夹并且选择 New > Class



新建类

此操作应当会打开 New Class 向导。我们将给类提供一个名称空间 lotto,并且将把类称为 Lottery



Lottery 类

Eclipse 现在将为您的类创建存根。CDT 可以为您提供很多有益的帮助。它将在头文件中生成相应的编译器指令。通过生成独立的接口(Lottery.h)和实现(Lottery.cpp)文件,有助于采用最佳实践,它还通过将类的析构函数声明为虚函数实现另一项最佳实践。我们可以向这些类输入清单 1 和清单 2 中所示的这些类的源代码。



                
#ifndef LOTTERY_H_
#define LOTTERY_H_
#include 
#include 
#include 
#include 
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 类的实现文件。



                
#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 所示:



                
**** 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





回页首


您可能已经注意到我们在头文件中声明 printTicket() 方法时把它声明成了一个虚方法。这将允许我们生成 Lottery 的子类并覆盖此方法。我们需要这样做的原因是某些州有 “mega” 号码的彩票。这是一个单独生成的号码,它是除了生成的其他号码以外任何彩票必须匹配的号码。让我们为这些州创建一个 Lottery 的子类 MegaLottery 类。

像以前所做的那样,再次右键单击源文件夹并且选择 New > Class。这次在 New Class 向导中,我们将在同一个名称空间中声明新类,但是把它称为 MegaLottery



MegaLottery 类

要生成 Lottery 的子类,请选择 Base Classes 部分旁边的 Add 按钮。此操作将打开 Choose Base Class 对话框。您可以开始键入类名,并且 Eclipse 将快速缩小基本候选类的列表。您需要选择 Lottery 并单击 OK



选择基类

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



                
#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 类的实现文件。



                
#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。这是 mega 号码可以获得的最大值。它将覆盖 printTicket() 方法。它将使用基类来生成彩票的第一部分,然后将生成 mega 号码并将其附加到彩票的字符串表示后面。

只是需要一种创建各种彩票的方法。我们将使用 Factory Pattern 类来完成此操作。我们将通过添加 LotteryFactory 类来完成此操作。我们需要所有 Lotteries 都来自同一个工厂,因此我们将使 LotteryFactory 保持独立。其代码如清单 6 和清单 7 所示:



                
#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 类的实现文件。



                
#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 有彩票的各种枚举类型。我们在示例中仅采用了 Florida 和 California,但是添加所需数目的类型应当不难。LotteryFactory 的构造函数将构造我们的彩票类所使用的 rand() 函数。我们只需实现可执行文件的 main 方法。



                
#include 
#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;
}





回页首


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



选择基类

选择 C/C++ Local Application 并单击 New 按钮。



新建 C/C++ 运行配置文件

此操作将打开 Lottery 项目的创建运行配置文件界面。您需要通过单击 Search Project 按钮来选择它的可执行文件。



搜索项目查找可执行文件

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



搜索项目查找可执行文件

只需单击 Run,并且程序应当已经在控制台中运行。下面的代码将显示一些样例输出。

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





回页首


程序应当运行正常,但是让我们看一下如何调试应用程序。首先,在代码中创建一个断点。选取一行并在它的旁边点击鼠标右键,然后选择 Toggle Breakpoint



创建断点

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



创建调试配置

此操作应当会打开调试配置。这是基于运行配置的,并且应当不需要更改任何内容。只需单击 Debug



调试配置

调试程序启动后,它将提示您切换到 Debugger 透视图。请按照提示操作。注意,在配置中,我们将设定调试程序在 main 方法启动时自动断开。因而,调试程序应当立即断开并且您应当会看到类似图 21 所示的屏幕。



调试程序





回页首



digg 将这篇文章提交到 Digg
del.icio.us 发布到 del.icio.us
Slashdot 提交到 Slashdot!

我们已经构建并调试了彩票应用程序。您可以向其中轻松地添加更多彩票模式。这其中的一些模式可以包括附加子类。CDT 使您可以比以往更轻松地创建这些类和类层次结构,以及更轻松地运行和调试应用程序进行测试。



学习

获得产品和技术
  • 了解关于 的信息,它是 Cygwin 附带的适用于 Windows 的 GNU C/C++ 工具。

  • 下载 ,这是针对 Windows 的类似 Linux 的环境。它包含两个部分:用作提供重要 Linux API 功能的 Linux API 仿真层的 DLL 和提供类似 Linux 风格的工具集。

  • 下载信息包含关于 CDT 可用版本的最新信息。

  • 在 IBM 中查阅最新的 。

  • 下载 IBM 产品评估版,并开始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

  • 使用 IBM 试用软件 改进您的下一个开发项目,这些软件可以通过下载或从 DVD 中获得。

讨论
  • Doug Schaefer 是 CDT 的首席开发人员。查阅 Doug on the Eclipse CDT 以获得关于 CDT 的最新新闻。

  • 应当是讨论关于 Eclipse 的问题的第一站(选择此链接将启动默认的 Usenet 新闻阅读器应用程序并打开 eclipse.platform)。

  • 中有很多参考资料适用于对使用和扩展 Eclipse 感兴趣的人员。

  • 参与 developerWorks blogs 并加入 developerWorks 社区。



Michael Galpin 自 1998 年以来一直从事 Web 应用程序专业开发。他是加州圣何塞市 eBay 公司的软件工程师。他拥有加州理工学院的数学学位。



阅读(11512) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~