禅宗与Visual Studio中的C / C ++调试艺术

介绍

本教程介绍了如何使用Visual Studio创建新的C ++程序,编译/运行程序,恢复现有程序的工作以及调试程序。 该课程面向正在努力使自己的程序奏效的刚入学的CIS学生。 我在我所就读的大学的计算机实验室工作,我看到许多学生不知道如何使用IDE来获得最佳效果。

Visual Studio自动创建许多文件,这些文件将很快填满软盘。 因此,应在C:驱动器或闪存驱动器上进行工作。 完成工作后,只需将临时项目文件夹中的内容复制到闪存中即可。 如果您决定直接从闪存驱动器工作,则无需复制。 关于使用闪存驱动器工作的一个简短说明是,对于大于2003的Visual Studion版本,它的运行速度会很慢。 这似乎源于Intellisense,但即使将其关闭也无济于事。 在这种情况下,您最好的选择是创建一个临时

用于开发的计算机上的projects文件夹,然后在其中复制项目。 创建一个项目

必须先创建一个项目,然后才能进行程序的工作。 对于新程序和已经开始工作的程序来说都是如此。 以下步骤描述了如何创建项目。

1.通过从“开始”菜单中选择“ Microsoft Visual Studio .NET 2003”来启动Microsoft Visual Studio .NET。 出现以下屏幕:

2.单击“开始”页面屏幕底部附近的“新建项目”按钮。

3.在“项目类型”下选择“ Visual C ++项目”文件夹。

4.在“项目类型”下选择Win32文件夹。

5.在模板下选择Win32 Console Project图标。

6.将名称文本框中的<输入名称>替换为MyProjectName1,其中MyProjectName1是您正在使用的程序的描述性名称。 例如,如果您要编写一个程序来计算MyTaxProgram中的所得税类型或类似的内容。

7.在“位置”文本框中键入C:\ projects,将您的工作保存在硬盘驱动器上。 您的文件将保存在C:\ projects \ MyProjectName1目录中,如果该目录尚不存在,则会创建该目录。 如果您使用闪存驱动器存储程序,则只需将上例中的C:\替换为闪存驱动器的盘符即可。

8.单击确定。

9.在出现的“ Win32应用程序向导”窗口中,单击“应用程序设置”。

10.单击其他选项下的清空项目复选框。

11.单击完成按钮,将创建项目。

如果您查看位于Visual Studio窗口最右侧的解决方案资源管理器,则应看到以下内容:

创建一个新的源代码文件

如果您正在使用新程序,则在创建项目后必须创建新的源代码文件。 下面的步骤描述了如何创建新的源代码文件并将其添加到项目中。

1.从菜单中选择文件,然后添加新项…

2.出现“添加新项”对话框时,单击“类别”下的“ Visual C ++”文件夹。 然后单击代码文件夹。

3.单击“模板”下的C ++ File(.cpp)图标。

4.将“名称”文本框中的<Enter Name>替换为Source1,Source1是源代码文件的名称。 您不必包括.cpp扩展名,但是如果您这样做,则可以。 一般而言,对于文件的主要功能使用描述性名称,例如,如果程序是税收计算器名称,则文件taxcalculator.cpp或类似名称。 “位置”文本框不必更改,但是如果不是该目录,则您希望将源文件更改为适合您项目的目录。

5.单击“打开”按钮,将创建一个新的空.cpp文件并将其打开,您可以在其中键入代码。

6.如果Source1.cpp文件未如上述屏幕那样出现在解决方案资源管理器中,请执行以下操作以将源代码文件添加到项目中(必须在尝试编译之前完成)

a)从菜单中选择文件。

B)从下拉菜单中选择将Source1.cpp移到项目中(其中Source1.cpp是您的源代码文件的名称)。

c)出现时选择MyProjectName1(其中MyProjectName1是您的项目的名称)。

编译我的第一个程序

1.将以下文本添加到Source1.cpp文件中:


// 
/// source1.cpp - 
/// Purpose: Some source code file 
/// 
/// Author: My Name 
/// Date: January 1st, 2xxx 
/// 
 
/// History 
/// INI 2xxx-01-01 v1.00.00 Initial release  
// Includes 
#include <iostream> 
#include <iomanip> 
using namespace std;  
int main(int argc, char** argv) 
    int ret_val = 0; // holds return value for main program  
    cout << "Hello World..." << endl;  
    return ret_val;  
2.从菜单中选择生成,然后选择生成解决方案。 您也可以同时按Ctrl + Shift + B键作为快捷方式。 来自编译器的消息(错误消息,警告消息和成功的编译/构建消息)将显示在屏幕底部的“输出”窗口中。

运行程序

编译/构建成功后,从菜单中选择“调试”,然后从下拉菜单中选择“开始而不调试”以运行程序。 您也可以改按Ctrl-F5。 如果出现一个窗口,显示“这些项目配置已过期:”,并询问“您要构建它们吗?”。 单击是。

一个称为控制台窗口的新窗口将打开并显示程序的输出语句,并允许程序输入。

让我们在代码中添加以下文本,使该程序更有趣。

1.在main之前添加以下文本:


// Global constants and variables 
#define PRG_NAME "MyProjectName1 - v 1.0.00" 
#define CPY_RGHT "Copyright © 2xxx - " 
#define AUTHOR "My Name"  
// function prototypes 
void show_copyright( void );  
2.在main中的“ Hello World…”语句之前,将此调用添加到版权功能中:

show_copyright();  
3.在main之后添加以下功能:

/// show_copyright 
/// Purpose: Show program name and copyright notice 
/// 
/// Parameters : None 
/// Output : couts PRG_NAME, CPY_RGHT and AUTHOR defines 
/// 
/// Returns : None 
/// SideEffects : None 
 
void show_copyright ( void ) 
    cout << AUTHOR << "'s " << PRG_NAME << endl; 
    cout << CPY_RGHT << AUTHOR << endl << endl; 
    return;  
完成所有这些更改后,您的Source1.cpp文件应如下所示:

4.现在像以前一样构建并运行解决方案。 您应该看到以下屏幕:

调试程序

有时可能很难确定为什么程序无法成功运行。 调试器允许程序员逐行浏览程序以查看其执行和失败。 在执行过程中也可以观察变量的值。

Visual Studio具有内置的调试器,可用于单步执行程序。 重要的是要注意程序必须首先编译。 让我们向Source1.cpp文件中添加更多代码(注意:此代码中有一个逻辑问题,可帮助您习惯调试):

1.在show_copyright函数原型之后的main之前添加以下代码:


char get_choice( void ); 
bool is_valid_choice( char );  
2.在main中添加以下内容:

char choice = NULL;  
3.将带有“ Hello World…”的提示语句更改为以下内容:

    do{ 
        cout << "Hello World..." << endl; 
        choice = get_choice(); 
    }while(!is_valid_choice( choice));  
4.在show_copyright函数之后添加以下函数:

/// get_choice 
/// Purpose: Check to see if user wants to continue 
/// 
/// Parameters: None 
/// Output: Prompts user to continue program 
/// 
/// Returns: char ch - Choice entered by user 
/// SideEffects: None 
char get_choice( void ) 
    char ret_val; 
    char ch; 
    cout << "Do you want to continue (1 = Yes) (0 = No) ?: "; 
    cin >> ch; 
    ret_val = ch;     
    return ret_val;  
/// is_valid_choice 
/// Purpose: Checks for valid yes or no entry to continue 
/// 
/// Parameters : char val - Current choice to continue 
/// Output : Displays an error message if an invalid choice is passed 
/// 
/// Returns : true if choice is valid and false otherwise 
/// SideEffects : None 
 
bool is_valid_choice( char val ) 
    bool ret_val = true; 
    switch (val){ 
        case 0: 
        case 1: 
            break; 
        default: 
            ret_val = false; 
            cout << "Invalid choice : " << val << endl; 
            cout << "Please enter one of the following(0 or 1) : " << endl; 
            break; 
    } 
    return ret_val; 
} return ret_val;  
5.和以前一样构建并运行该解决方案,您应该看到以下屏幕:

6.按下0,而不是像我们要求我们的程序继续那样停止程序。 沃森在这里有一个错误。 按Ctrl + C停止执行程序,然后关闭窗口。 现在,我们将使用Visual Studio中的调试器在代码中查找错误。

断点

断点告诉调试器暂停执行程序,直到您告诉它继续执行为止。 为了单步执行程序(即监视程序执行),应在要暂停执行的可执行语句上设置一个断点。 要在语句上设置断点,请单击该语句,然后按F9。 屏幕左侧将出现一个红点,表明已设置断点。 再次按F9可以删除断点。 请注意,如果退出Visual Studio,则不会保存断点。

可执行语句是在程序运行时执行操作的代码行。 非可执行语句的示例包括注释,变量声明和do循环中的do一词。 如果在这些类型的语句上设置了断点,则调试器将不会在执行期间在它们上暂停。 此外,断点可能会自动移至编译器确定的下一个可执行语句。

确定所需的断点是调试的关键部分。 将断点放在程序执行的早期,您会浪费时间逐步浏览不需要的代码。 将断点设置得太晚,您可能会完全错过该错误。 在上面的示例程序中,我们必须在代码中可能会引起问题的位置。 get_choice函数未返回正确的值,或者is_valid_choice函数未正确检查该值。 让我们设置一个断点来检查get_choice函数的返回值。 有两个可能的地方检查值,一个地方在函数本身内部或在main的赋值语句中。 我们将在main中设置断点,以便我们可以检查返回值。 将光标放在读取的行上,choice = get_choice(); 然后按F9或单击鼠标右键以显示上下文菜单,然后选择“插入断点”。

屏幕左侧将出现一个红点,如下所示:

观看程序执行

设置断点后,从菜单中选择“调试”,然后从下拉菜单中启动,以启动调试器。 您也可以键入F5。 程序将开始运行,但在执行之前在带有断点的语句处暂停。 对于我们的示例,您应该看到类似以下屏幕的内容:

此时,您有许多选择(如下所示)。 可以在“调试”工具栏上找到提到的按钮。 当您按F5键时,工具栏应自动出现,但如果没有,则可以通过以下操作访问工具栏:

1.从菜单中选择“查看”,然后从下拉菜单中选择“工具栏”,然后选择“调试”。

这是工具栏的外观以及您可以使用按钮进行的​​操作:

•单击“跳过”按钮

执行当前语句。 重复此步骤以查看整个程序执行。

•如果您想随时退出调试器并停止程序执行,请单击“停止调试”按钮

•如果要重新开始执行程序,请从头开始并使用调试器,单击“重新启动”按钮。

如果您的程序具有除main以外的功能,则有两个附加选择。

•如果当前语句是函数调用,请单击“单步执行”按钮

进入功能以观看其执行。

•如果您正在逐步执行某个功能,而又不想观看其余功能的执行,请单击“逐步退出”按钮

退出功能。 调试器仍将逐步完成程序的其余部分。 变量值

了解正在执行的程序中某一点的变量值通常会很有帮助。 调试器允许您在程序执行时查看变量的内容。 当您按F5键时,“ Locals Windows”应该会自动出现在屏幕底部,但如果没有,则可以执行以下操作:

1.从菜单中选择“调试”,从下拉菜单中选择“ Windows”,然后选择“本地”。 屏幕底部的窗口将显示当前函数(例如,main中)中变量的值。 当您逐步执行程序时,变量的显示值将随着变量本身被赋予新值而改变。

对于我们的示例,您应该在屏幕底部的Locals Windows中看到以下内容。

注意上面窗口中的选择值。 char变量选择初始化为NULL或本例中为0。一旦get_choice函数返回一个值,我们将在下一节中对其进行仔细检查。

输入输出

控制台窗口仍将用于程序输入和输出。 如果单击cin语句上的“跳过”按钮,请在控制台窗口中键入数据。 当您按Enter键时,调试器将继续执行程序。 如果单击cout语句上的“跳过”按钮,则数据将显示在控制台窗口中。 对于我们的示例,您将看到该程序的当前控制台窗口:

由于我们尚未执行get_choice函数的语句,因此到目前为止,仅显示“ Hello World…”语句。 单击“调试”工具栏上的“跳过”按钮,然后在程序的控制台窗口中注意以下更改。

在控制台窗口中,在提示符处键入1,然后按Enter继续程序。 现在,控制台窗口应如下所示:

现在,Visual Studio屏幕底部的“本地窗口”应该具有以下值可供选择。

请注意与之前的49和'1'而不是0相比的变化。49是字符1的ASCII值,因此get_choice函数正确返回了一个字符值,而选择正确地存储了该值。 通过逐步执行程序,我们发现我们的错误不在get_choice函数中。 由于程序中的下一个语句是我们需要检查的另一个函数,is_valid_choice,并且我们知道有效的字符已存储在选择中,并且is_valid_choice函数应保持循环且没有错误消息。 使用“跳过”按钮执行is_valid_choice函数。 注意我们的控制台窗口发生了什么。

这是不正确的,因为我们知道main中的以下语句将变量1中的字符1传递给了is_valid_choice函数:} while(!is_valid_choice(choice));。 因此,问题必须出在is_valid_choice检查值的方式上。 因此,我们将使用“跳入”按钮执行该函数中的每个语句,以找出问题出在哪里。 但是首先,您必须“跳过”几个语句才能再次进入is_valid_function。 请注意,Visual Studio窗口的左侧有一个黄色箭头。 那表示当前的陈述。

在我们的示例中,cout语句显示“ Hello World…”消息。 按“跳过”按钮执行此语句。 再次按Step Over按钮以执行get_choice函数语句。 在控制台窗口中,在提示符处键入1,然后按Enter继续程序。 现在,按“跳入”按钮以调试is_valid_choice函数。 请注意,黄色箭头现在位于is_valid_choice函数内部,并且位于底部的Locals Window底部具有名为val的变量,该变量具有从main传递给变量选择49和'1'的值。

按下“跳过”按钮,直到黄色箭头位于带有switch语句的行上。 再按一次“跳过”按钮,请注意,箭头一直跳到开关的default:部分内的第一个语句。 看到后应该已经打了break语句


case 1: 
break;  
但这不是出于某种原因。 您在寻找什么

调试器最有用的方法有两种:1)验证语句是否按预期执行,以及2)验证变量是否具有预期值。 非常仔细地看一下case语句,我们似乎正在将整数1与字符1(在ASCII中为49)进行比较,因此我们的程序运行正常,但是逻辑测试不正确。 在is_valid_choice函数中更改case语句以查找字符数据:


switch (val){ 
case '0': 
case '1': 
break;  
编辑代码以纠正问题后,保存更改,按调试工具栏上的“停止”按钮,然后重新生成程序。 现在重新启动调试器。 按Step Over按钮直到您到达get_choice语句,然后再次输入1并按Enter,然后像在控制台窗口中一样按Enter。 请注意,这次,黄色箭头会像预期的那样跳到程序的末尾。

按“停止”按钮并通过将光标置于带红点的行上并按F9来删除断点。

此程序中还有一个逻辑问题,您应该使用相同的技术来查找它。 (提示:程序应继续打印“ Hello World…”,并要求用户在提示输入1时继续。)

保存工作

当您完成工作时(因为您的程序已完成或因为您以后需要恢复工作),请将源代码文件从硬盘驱动器上的工作目录复制到软盘中。 无需复制任何其他文件。

复制源代码文件之前,请关闭Visual Studio。 如果要求您保存任何文件,请说“是”,除非您知道您已对不想保存的程序进行了更改。

一旦确定源代码文件已保存到软盘中,请从硬盘驱动器中删除工作目录。

恢复现有源代码文件上的工作

如果要恢复程序的工作,则必须首先创建一个项目,然后将现有的源代码文件添加到该项目中。 此过程描述如下。

1.在C:驱动器的根目录下创建一个名为projects的目录。

2.将您的源代码文件复制到工作目录。

3.按照上面的创建项目下的步骤进行操作。

4.从菜单中选择文件,然后添加现有项

5.在出现的“添加现有项”窗口中,在工作目录中找到您的源代码文件,然后单击它以将其选中。 单击打开按钮。

6.从菜单中选择“文件”,然后从下拉菜单中选择“将xxx.cpp移入项目”(其中xxx.cpp是您的源代码文件的名称)。

7.在项目名称出现时选择它。

8.现在,您可以继续处理程序。

注意:如果您退出了Microsoft Visual Studio,但没有任何进一步的操作,则可以双击项目文件和Visual Studio,然后将打开程序供您继续工作。 项目文件将位于工作目录中,并将具有.vcproj文件扩展名。 在尝试编译之前,必须将源代码文件添加到项目中(上面的步骤6和7)。

从项目中删除源代码文件

有时可能需要在不退出Visual Studio的情况下从现有项目中删除源代码文件。 请注意,以下步骤不会从工作目录中删除文件。

1.选择屏幕右侧的解决方案资源管理器“选项卡”。

2.选择名为“源文件”的“文件夹”下列出的源代码文件的名称。 列出的文件夹在磁盘上实际上不存在。 它们仅在项目内用于组织其文件。

3.按Delete键从项目中删除文件。

从项目中删除文件并且不退出Visual Studio之后,可以按照以下步骤将现有文件添加到项目中。

1.从菜单中选择“文件”,然后选择“添加现有项...”。

2.在出现的“添加现有项”窗口中,在工作目录中找到您的源代码文件,然后单击它以将其选中。 单击打开按钮。

3.在“解决方案资源管理器”“选项卡”上名为“源文件”的“文件夹”中双击您的源代码文件以将其打开。

4.从菜单中选择“文件”,然后从下拉菜单中选择“将xxx.cpp移到项目中”(其中xxx .cpp是您的源代码文件的名称)。 出现时选择解决方案项目。

5.从菜单中选择文件,然后从下拉菜单中选择将xxx.cpp移入项目。 在项目名称出现时选择它。

6.您现在可以继续处理程序。

I / O文件位置

将要读取的文件(输入文件)和源代码文件一起放在MyProjectName1目录中。 程序运行时将从该目录读取文件。

如果您的程序创建了一个文本文件,即输出文件,则将在MyProjectName1目录中创建该文件。 使用记事本查看文件内容或将文件作为资源添加到项目中。

解决方案

这是严格的标准C解决方案...


///
/// \file main.c
/// \brief Some source code file Project Main Module
/// 
/// \author My Name
/// \version 00.99.00
/// \date January 1st, 2xxx
///
 
// History 
// INI 2xxx-01-01 v1.00.00 Initial release  
// Includes 
#include <stdio.h> 
#include <stdlib.h> 
// Global constants and variables 
#define PRG_NAME "MyProjectName1 - v 1.0.00" 
#define CPY_RGHT "Copyright © 2xxx - " 
#define AUTHOR "My Name"  
// function prototypes 
void show_copyright( void ); 
char get_choice( void ); 
unsigned int is_valid_choice( char );  
// Uncomment to run just the testing main
//#define TEST 1 
/
/// \fn main(int argc, char** argv)
/// \brief Main module for Hello World program.
///
/// \param argc - integer number of arguments passed from system to program
/// \param argv - pointer to array of characters of arguments passed to program from system
///
/// \return integer value for success or failure
/
#ifndef TEST
int main(int argc, char** argv) 
    int ret_val = 0; // holds return value for main program 
    char choice = '0';
    show_copyright(); 
    do{    
        do{ 
            printf("Hello World...\n"); 
            choice = get_choice(); 
        }while(!is_valid_choice( choice));
    }while(choice == '1'); 
    return ret_val; 
#else // Testing Main
int main( int argc, char** argv)
{
    int ret_val = 0; 
    return ret_val;    
}
#endif 
/// \fn show_copyright(void) 
/// \brief Show program name and copyright notice 
/// 
/// \b SideEffects : None\n
/// \b Output : couts PRG_NAME, CPY_RGHT and AUTHOR defines\n
///
/// \return None
 
void show_copyright ( void ) 
    printf("%s 's %s\n", AUTHOR, PRG_NAME); 
    printf("%s %s\n", CPY_RGHT, AUTHOR); 
    return;  
/// \fn get_choice( void )
/// \brief Check to see if user wants to continue 
/// 
/// \b SideEffects: None\n 
/// \b Output: Prompts user to continue program\n
/// 
/// \param None 
/// 
/// \return char ch - Choice entered by user 
char get_choice( void ) 
    char ret_val; 
    char ch; 
    printf("Do you want to continue (1 = Yes) (0 = No) ?: ");
    fflush(stdin);
    scanf("%c^%*",&ch); 
    ret_val = ch;     
    return ret_val;  
/// \fn is_valid_choice( char val ) 
/// \brief Checks for valid yes or no entry to continue 
/// 
/// \b SideEffects : None\n 
/// \b Output : Displays an error message if an invalid choice is passed \n
/// 
/// \param val - Current choice to continue 
/// 
/// \return boolean true if choice is valid and false otherwise 
 
unsigned int is_valid_choice( char val ) 
    unsigned int ret_val = 1; 
    switch (val){ 
        case '0': 
        case '1': 
            break; 
        default: 
            ret_val = 0; 
            printf("Invalid choice : %c\n", val); 
            printf("Please enter one of the following(0 or 1) : \n"); 
            break; 
    } 
    return ret_val;  
C ++ with Streams解决方案

///
/// \file main.cpp
/// \brief Some source code file Project Main Module
/// 
/// \author My Name
/// \version 00.99.00
/// \date January 1st, 2xxx
///
 
// History 
// INI 2xxx-01-01 v1.00.00 Initial release  
// Includes 
#include <iostream> 
#include <iomanip> 
using namespace std;  
// Global constants and variables 
const char PRG_NAME[] = {"MyProjectName1 - v 1.0.00"};
const char CPY_RGHT[] = {"Copyright © 2xxx - "};
const char AUTHOR[] = {"My Name"};  
// function prototypes 
void show_copyright( void ); 
char get_choice( void ); 
bool is_valid_choice( char );  
// Uncomment to run just the testing main
//#define TEST 1 
/
/// \fn main(int argc, char** argv)
/// \brief Main module for Hello World program.
///
/// \param argc - integer number of arguments passed from system to program
/// \param argv - pointer to array of characters of arguments passed to program from system
///
/// \return integer value for success or failure
/
#ifndef TEST
int main(int argc, char** argv) 
    int ret_val = 0; // holds return value for main program 
    char choice;
    show_copyright(); 
    do{
        do{ 
            cout << "Hello World..." << endl; 
            choice = get_choice(); 
        }while(!is_valid_choice( choice)); 
    }while(choice == '1'); 
    return ret_val; 
#else // Testing Main
int main( int argc, char** argv)
{
    int ret_val = 0; 
    return ret_val;    
}
#endif 
/// \fn show_copyright(void) 
/// \brief Show program name and copyright notice 
/// 
/// \b SideEffects : None\n
/// \b Output : couts PRG_NAME, CPY_RGHT and AUTHOR defines\n
///
/// \return None
 
void show_copyright ( void ) 
    cout << AUTHOR << "'s " << PRG_NAME << endl; 
    cout << CPY_RGHT << AUTHOR << endl << endl; 
    return;  
/// \fn get_choice( void )
/// \brief Check to see if user wants to continue 
/// 
/// \b SideEffects: None\n 
/// \b Output: Prompts user to continue program\n
/// 
/// \param None 
/// 
/// \return char ch - Choice entered by user 
char get_choice( void ) 
    char ret_val; 
    char ch; 
    cout << "Do you want to continue (1 = Yes) (0 = No) ?: "; 
    cin >> ch; 
    ret_val = ch;     
    return ret_val;  
/// \fn is_valid_choice( char val ) 
/// \brief Checks for valid yes or no entry to continue 
/// 
/// \b SideEffects : None\n 
/// \b Output : Displays an error message if an invalid choice is passed \n
/// 
/// \param val - Current choice to continue 
/// 
/// \return boolean true if choice is valid and false otherwise 
 
bool is_valid_choice( char val ) 
    bool ret_val = true; 
    switch (val){ 
        case '0': 
        case '1': 
            break; 
        default: 
            ret_val = false; 
            cout << "Invalid choice : " << val << endl; 
            cout << "Please enter one of the following(0 or 1) : " << endl; 
            break; 
    } 
    return ret_val;  
最后是带有类解决方案的C ++

main.cpp


///
/// \file main.cpp
/// \brief Some source code file Project Main Module
/// 
/// \author My Name
/// \version 00.99.00
/// \date January 1st, 2xxx
///
 
// History 
// INI 2xxx-01-01 v1.00.00 Initial release  
// Includes 
#include <iostream> 
#include <iomanip>
#include "oApp.h" 
using namespace std;  
// Uncomment to run just the testing main
//#define TEST 1 
/
/// \fn main(int argc, char** argv)
/// \brief Main module for Hello World program.
///
/// \param argc - integer number of arguments passed from system to program
/// \param argv - pointer to array of characters of arguments passed to program from system
///
/// \return integer value for success or failure
/
#ifndef TEST
int main(int argc, char** argv) 
    int ret_val = 0; // holds return value for main program 
    oApp* myApp = new oApp; 
    myApp->init("Your Message Here...\n");
    myApp->set_copyright("Copyright© 2006-2008 - ");
    myApp->set_author("Your Name");
    myApp->set_program_name("YourProgramName v00.99.00");
    myApp->run();
    myApp->done(); 
    delete myApp; 
    return ret_val; 
#else // Testing Main
int main( int argc, char** argv)
{
    int ret_val = 0; 
    return ret_val;    
}
#endif 
应用程序

#include <iostream>
#include <iomanip>
#include <string>
using namespace std; 
class oApp{ 
public:
    oApp(){
        m_choice = '0';
        m_author = "My Name";
        m_copyright = "Copyright © 2xxx - ";
        m_program = "MyProjectName1 v1.0.00";
        m_message = "Hello World...";
    } 
    ~oApp() {};
    void init( const string s );
    void run( void );
    void done( void ); 
    string get_copyright( void );
    bool set_copyright( const string copyright );
    string get_author( void );
    bool set_author( const string author );
    string get_program_name( void );
    bool set_program_name( const string name ); 
    void show_copyright( void ); 
private:
    string m_author;
    string m_program;
    string m_copyright;
    string m_message;
    char m_choice; 
    char get_choice( void );
    bool is_valid_choice( char val );
}; 
oApp.cpp

#include "oApp.h" 
void oApp::init( const string s )
{
    this->m_message = s;
} 
void oApp::run( void )
{
    show_copyright(); 
    do{
        do{ 
            cout << this->m_message << endl; 
            this->m_choice = get_choice(); 
        }while(!is_valid_choice( this->m_choice )); 
    }while(this->m_choice == '1');
} 
void oApp::done( void ){} 
string oApp::get_copyright( void )
{
    string ret_val = this->m_copyright;
    return ret_val;
} 
bool oApp::set_copyright( const string copyright )
{
    bool ret_val = false;
    m_copyright = copyright;
    ret_val = this->m_copyright == copyright;
    return ret_val;
} 
string oApp::get_author( void )
{
    string ret_val = this->m_author;
    return ret_val;
} 
bool oApp::set_author( const string author )
{
    bool ret_val = false;
    m_author = author;
    ret_val = this->m_author == author;
    return ret_val;
} 
string oApp::get_program_name( void )
{
    string ret_val = this->m_program;
    return ret_val;
} 
bool oApp::set_program_name( const string name )
{
    bool ret_val = false;
    m_program = name;
    ret_val = this->m_program == name;
    return ret_val;
} 
/// \fn get_choice( void )
/// \brief Check to see if user wants to continue 
/// 
/// \b SideEffects: None\n 
/// \b Output: Prompts user to continue program\n
/// 
/// \param None 
/// 
/// \return char ch - Choice entered by user 
char oApp::get_choice( void )
{
    char ret_val; 
    char ch; 
    cout << "Do you want to continue (1 = Yes) (0 = No) ?: "; 
    cin >> ch; 
    ret_val = ch;     
    return ret_val; 
} 
/// \fn is_valid_choice( char val ) 
/// \brief Checks for valid yes or no entry to continue 
/// 
/// \b SideEffects : None\n 
/// \b Output : Displays an error message if an invalid choice is passed \n
/// 
/// \param val - Current choice to continue 
/// 
/// \return boolean true if choice is valid and false otherwise 
 
bool oApp::is_valid_choice( char val )
{
    bool ret_val = true; 
    switch (val){ 
        case '0': 
        case '1': 
            break; 
        default: 
            ret_val = false; 
            cout << "Invalid choice : " << val << endl; 
            cout << "Please enter one of the following(0 or 1) : " << endl; 
            break; 
    } 
    return ret_val; 
} 
/// \fn show_copyright(void) 
/// \brief Show program name and copyright notice 
/// 
/// \b SideEffects : None\n
/// \b Output : couts m_ProgramName, m_Copyright and m_Author\n
///
/// \return None
 
void oApp::show_copyright ( void ) 
    cout << this->m_author << "'s " << this->m_program << endl; 
    cout << this->m_copyright << this->m_author << endl << endl; 
    return;  

From: https://bytes.com/topic/c/insights/827833-zen-art-debugging-c-c-visual-studio

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值