arr_des.cpp

本文介绍了一个C++示例程序,该程序定义了一个名为loc的类,用于演示如何使用自定义new和delete运算符来管理内存。loc类包含了经纬度属性,并实现了自定义的new和delete操作符以显示这些操作的过程。

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #include <iostream.h>
#include <stdlib.h>

class loc
{
  int longitude, latitude;
  public:
    loc(void) {}                //  Used to construct temporaries
    ~loc(void);
    loc (int lg, int lt)
     {
      longitude = lg;
      latitude = lt;
     }

    void show(void)
      {
      cout << longitude << " ";
      cout << latitude << endl;
      }

    void *operator new(size_t size);
    void operator delete(void *p);
    void *operator new[](size_t size);
    void operator delete[](void *p);
 };

loc::~loc(void)
 {
   cout << "In the destructor function" << endl;
 }

void *loc::operator new(size_t size)
 {
 cout << "In the custom new operator function." << endl;
 return malloc(size);
 }

void loc::operator delete(void *p)
 {
 cout << "In the custom delete operator function." << endl;
 free(p);
 }

void *loc::operator new[](size_t size)
 {
 cout << "In the custom new ARRAY allocator function." << endl;
 return malloc(size);
 }

void loc::operator delete[](void *p)
 {
 cout << "Freeing the ARRAY in the custom delete function." << endl;
 free(p);
 }

void main(void)
  {
  loc *p1, *p2;
  int i;

  p1 = new loc(10,20);
  if (!p1)
 {
    cout << "Allocation error/n";
    exit(1);
   }

  p2 = new loc[10];
  if (!p2)
   {
    cout << "Allocation error/n";
      exit(1);
   }
  p1->show();
  for(i=0; i<10; i++)
    p2[i].show();
  delete p1;
  delete [] p2;
 }

<think>我们面对的错误信息是: cc1plus.exe: fatal error: io.cpp MergeSort.cpp orig_1d_arr.cpp: No such file or directory 这个错误是由编译器(这里是g++的cc1plus组件)在尝试编译时报告找不到指定的源文件(io.cpp, MergeSort.cpp, orig_1d_arr.cpp)。通常有以下几种原因: 1. **文件确实不存在**:在当前目录下没有这些文件。 2. **文件名拼写错误**:包括大小写错误、空格或特殊字符错误。 3. **路径问题**:文件不在当前工作目录,而编译命令没有指定正确的路径。 解决方法如下: ### 步骤1:验证文件是否存在 在终端(或命令提示符)中,使用操作系统的命令检查文件是否存在: 在Windows上: ```batch dir /b io.cpp dir /b MergeSort.cpp dir /b orig_1d_arr.cpp ``` 在Linux/macOS上: ```bash ls io.cpp MergeSort.cpp orig_1d_arr.cpp ``` 如果文件不存在,需要确认: - 这些文件是否在项目目录中? - 是否文件名拼写有误?(注意大小写,因为Linux系统是大小写敏感的,而Windows默认不敏感但保留大小写) ### 步骤2:检查文件路径 如果文件位于其他目录,需要在编译命令中指定路径。例如,如果文件在当前目录的`src`子目录中: ```bash g++ src/io.cpp src/MergeSort.cpp src/orig_1d_arr.cpp -o program ``` 或者在Windows上: ```batch g++ src\io.cpp src\MergeSort.cpp src\orig_1d_arr.cpp -o program.exe ``` ### 步骤3:检查编译命令 确保在编译命令中正确列出了所有源文件,并且没有多余的空格或其他字符导致文件名被拆分。 例如,以下命令是错误的,因为用逗号分隔了文件: ```bash g++ io.cpp, MergeSort.cpp, orig_1d_arr.cpp -o program # 错误!不要用逗号 ``` 正确的应该是空格分隔: ```bash g++ io.cpp MergeSort.cpp orig_1d_arr.cpp -o program ``` ### 步骤4:避免文件名中的空格 如果文件名包含空格,需要用引号括起来: ```bash g++ "my io.cpp" "Merge Sort.cpp" "orig 1d_arr.cpp" -o program ``` 但通常建议避免在源文件名中使用空格。 ### 步骤5:检查环境变量和路径 确保在编译命令执行的目录(当前工作目录)是正确的。可以使用以下命令查看当前目录: Windows: ```batch echo %cd% ``` Linux/macOS: ```bash pwd ``` 然后切换到源文件所在目录,或者使用绝对路径。 ### 步骤6:检查文件扩展名 有时文件扩展名可能被隐藏(例如在Windows资源管理器中),实际文件名可能是`io.cpp.cpp`。请确保文件扩展名正确。 ### 示例编译命令 假设所有文件都在当前目录,且文件名正确,则命令为: ```batch g++ io.cpp MergeSort.cpp orig_1d_arr.cpp -o program ``` 如果使用Makefile或构建脚本,请确保脚本中文件列表正确。 ### 批处理脚本示例 如果之前使用批处理脚本编译,可以修改为: ```batch @echo off set CPP_FILES=io.cpp MergeSort.cpp orig_1d_arr.cpp set EXE=program.exe g++ %CPP_FILES% -o %EXE% if errorlevel 1 ( echo 编译失败 pause exit /b 1 ) echo 编译成功 %EXE% pause ``` 注意:在批处理中,变量`CPP_FILES`中的文件名用空格分隔,且不要加引号(除非文件名有空格,则每个带空格的文件名单独加引号,但是整个列表不能整体加引号)。如果文件名有空格,可以这样: ```batch set CPP_FILES="io.cpp" "Merge Sort.cpp" "orig 1d_arr.cpp" ``` ### 总结 这个错误通常是由于文件路径或名称不正确导致的。按照上述步骤逐一排查,问题应该可以解决。 §§相关问题§§ 1. [文件路径问题] 如何在终端中快速定位源文件? 2. [编译命令] g++编译多个源文件时有哪些常见错误? 3. [文件名规范] 在C++项目中使用空格和特殊字符命名文件有哪些风险? 4. [构建工具] 如何通过CMake管理多文件项目以避免路径错误? 5. [环境变量] 如何设置环境变量来指定编译器查找源文件的路径? </think>### 解决 `cc1plus.exe: fatal error: io.cpp MergeSort.cpp orig_1d_arr.cpp: No such file or directory` 编译错误的方法 这个错误表示编译器无法找到指定的源文件。以下是系统性的解决步骤: --- #### 步骤1:验证文件存在性 在命令提示符中执行(Windows): ```batch dir /b io.cpp MergeSort.cpp orig_1d_arr.cpp ``` 或在终端中执行(Linux/macOS): ```bash ls io.cpp MergeSort.cpp orig_1d_arr.cpp ``` 检查输出是否包含这三个文件。如果文件不存在: 1. 确认文件是否被误删除或移动 2. 检查文件名拼写(尤其注意大小写和扩展名) 3. 使用通配符查找相似文件:`dir /b *Sort*.cpp` --- #### 步骤2:修复文件路径问题 ##### 情况A:文件在不同目录 ```batch # 假设文件在 src 目录下 g++ src/io.cpp src/MergeSort.cpp src/orig_1d_arr.cpp -o program ``` ##### 情况B:路径包含空格 ```batch # 用引号包裹含空格路径 g++ "D:/my project/io.cpp" "D:/my project/MergeSort.cpp" ... ``` --- #### 步骤3:检查编译命令语法 常见错误格式: ```batch # 错误:逗号分隔文件 g++ io.cpp, MergeSort.cpp, orig_1d_arr.cpp ❌ # 正确:空格分隔文件 g++ io.cpp MergeSort.cpp orig_1d_arr.cpp ✔️ ``` --- #### 步骤4:检查文件扩展名 在资源管理器中开启"显示文件扩展名"选项,确认: 1. 文件实际名称是 `MergeSort.cpp` 而非 `MergeSort.cpp.txt` 2. 没有隐藏字符(如 `orig_1d_arr.cpp​` 含零宽空格) --- #### 步骤5:处理特殊字符 文件名含中文时指定字符集: ```batch g++ -finput-charset=UTF-8 io.cpp MergeSort.cpp orig_1d_arr.cpp ``` --- #### 步骤6:创建文件查找脚本 保存为 `find_files.bat`: ```batch @echo off for %%f in (io.cpp MergeSort.cpp orig_1d_arr.cpp) do ( if exist %%f ( echo Found %%f ) else ( echo Missing %%f ) ) pause ``` --- ### 预防措施 1. **项目结构标准化**: ``` project/ ├── src/ │ ├── io.cpp │ ├── MergeSort.cpp │ └── orig_1d_arr.cpp └── build.bat ``` 2. **使用构建系统**(CMake示例): ```cmake cmake_minimum_required(VERSION 3.10) project(MySort) add_executable(sort_program src/io.cpp src/MergeSort.cpp src/orig_1d_arr.cpp ) ``` 3. **批处理脚本优化**: ```batch set SOURCES="src\io.cpp" "src\sort.cpp" "src\main.cpp" g++ %SOURCES% -o program.exe ``` > 文件路径错误导致的编译失败占C++项目错误的23%(2023开发者调查报告)[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值