以下是我的代码:

  1. //TaskConfigFile.h
  2. #pragma once
  3. using namespace System::Collections::Generic;
  4. using namespace System;
  5. using namespace System::IO;
  6. using namespace System::Text;
  7.  
  8. ref class TaskConfigFile
  9. {
  10. public:
  11. TaskConfigFile();
  12. TaskConfigFile(String^ str_link, Int64 file_size, short threads_sum);
  13. TaskConfigFile(String^ str_link, Int64 file_size);
  14.  
  15. String^ link;//下载链接
  16. String^ fileName;//文件名
  17. String^ filePath;//文件存储路径
  18. Int64 fileSize;//文件总大小
  19. Int64 blockSize;//文件分块大小
  20. Int64 sumDownloadedSize;//已下载的总大小
  21. short threadsSum;//线程总数,默认为5
  22.  
  23. //以字典记录各分块已下载的大小,key为分块的起始位置(字节),value为此分块已下载的大小
  24. Dictionary<Int64, Int64>^ blockDownloadedSize;
  25.  
  26. #ifdef DEBUG
  27. Debug::Listeners->Add( gcnew TextWriterTraceListener( Console::Out ) );
  28. Debug::AutoFlush = true;
  29. #endif
  30. bool Save();//保存配置信息
  31. bool Load(String^ path);//加载配置信息
  32. };
  1. //TaskConfigFile.cpp
  2. #include "stdafx.h"
  3. #include "TaskConfigFile.h"
  4.  
  5. TaskConfigFile::TaskConfigFile():
  6. link(nullptr), fileName(nullptr), fileSize(0L), filePath(nullptr), blockSize(0L), sumDownloadedSize(0L), threadsSum()
  7. {
  8. blockDownloadedSize = gcnew Dictionary<Int64, Int64>(threadsSum);
  9. }
  10.  
  11. TaskConfigFile::TaskConfigFile(String^ str_link, Int64 file_size, short threads_sum):
  12. link(str_link), fileSize(file_size), threadsSum(threads_sum), sumDownloadedSize()
  13. {
  14. blockDownloadedSize = gcnew Dictionary<Int64, Int64>(threadsSum);
  15. }
  16.  
  17. TaskConfigFile::TaskConfigFile(String^ str_link, Int64 file_size):
  18. link(str_link), fileSize(file_size), threadsSum(), sumDownloadedSize()
  19. {
  20. blockDownloadedSize = gcnew Dictionary<Int64, Int64>(threadsSum);
  21. }
  22.  
  23. bool TaskConfigFile::Save()
  24. {
  25. String^ path = String::Concat(filePath, fileName, ".tmp");
  26. Stream^ writeStream = gcnew FileStream(path, FileMode::Create, FileAccess::Write);
  27. if(writeStream == nullptr)
  28. {
  29. #ifdef DEBUG
  30. Diagnostics::Debug::WriteLine("文件路径错误!");
  31. #endif
  32. return false;
  33. }
  34.  
  35. BinaryWriter^ binaryWriter = gcnew BinaryWriter(writeStream, Encoding::ASCII);
  36. binaryWriter->Write(this->link);
  37. binaryWriter->Write(this->fileName);
  38. binaryWriter->Write(this->filePath);
  39. binaryWriter->Write(this->fileSize);
  40. binaryWriter->Write(this->blockSize);
  41. binaryWriter->Write(this->sumDownloadedSize);
  42. binaryWriter->Write(this->threadsSum);
  43. for each(KeyValuePair<Int64, Int64> pair in blockDownloadedSize)
  44. {
  45. binaryWriter->Write(pair.Key);
  46. binaryWriter->Write(pair.Value);
  47. }
  48. writeStream->Close();
  49. binaryWriter->Close();
  50. return true;
  51. }
  52.  
  53. bool TaskConfigFile::Load(String^ path)
  54. {
  55. Stream^ readStream = gcnew FileStream(path, FileMode::Open, FileAccess::Read);
  56. if(readStream == nullptr)
  57. {
  58. #ifdef DEBUG
  59. Diagnostics::Debug::Indent();
  60. Diagnostics::Debug::WriteLine("error: 打开文件失败!");
  61. Diagnostics::Debug::WriteLine("Paht: {0}", path);
  62. Diagnostics::Debug::UnIndent();
  63. #endif
  64. return false;
  65. }
  66. BinaryReader^ binaryReader = gcnew BinaryReader(readStream);
  67. try
  68. {
  69. link = binaryReader->ReadString();
  70. fileName = binaryReader->ReadString();
  71. filePath = binaryReader->ReadString();
  72. fileSize = binaryReader->ReadInt64();
  73. blockSize = binaryReader->ReadInt64();
  74. sumDownloadedSize = binaryReader->ReadInt64();
  75. threadsSum = binaryReader->ReadInt16();
  76. for(int i = ; i < threadsSum; ++i)
  77. {
  78. Int64 key = binaryReader->ReadInt64();
  79. Int64 value = binaryReader->ReadInt64();
  80. blockDownloadedSize->Add(key, value);
  81. }
  82. }
  83. catch(EndOfStreamException^ ex)
  84. {
  85. #ifdef DEBUG
  86. Diagnostics::Debug::Indent();
  87. Diagnostics::Debug::WriteLine("The end of the stream is reached.");
  88. Diagnostics::Debug::WriteLine(ex->Message);
  89. Diagnostics::Debug::Unindent();
  90. #endif
  91. readStream->Close();
  92. binaryReader->Close();
  93. return true;
  94. }
  95.  
  96. return true;
  97.  
  98. }

我将他们放在同一个文件就能编译通过。一旦分开就会出现链接错误:

这是因为.NET以程序集作为编译单元,每一个程序集里类的成员声明与定义必须在同一个namespace下,而这两个文件中并没有声明namespace,所以链接器找不到TaskConfigFile Class成员的实现代码。

必须将它们声明在同一个namspace中:

  1. //TaskConfigFile.h
  2. namespace xxx
  3. {
  4. //..............
  5. }
  6.  
  7. //TaskConfigFile.cpp
  8. using namespace xxx;

C++/CLI中class成员声明与实现分开在不同文件时必须添加namespace的更多相关文章

  1. C#中解决Response.AddHeader("Content-Disposition", "attachment; filename=" + filename)下载文件时文件名乱码的问题

    问题:下载文件时文件名乱码怎么解决? 在C#写后台代码过程中,经常遇到下载文件出现文件名乱码的问题,在网上找了很多方法,总是存在浏览器不兼容的问题,当IE浏览器不乱码时,火狐浏览器就会乱码,后来经过反 ...

  2. 新建Class文件时,添加作者版权注释声明

    以安装路径C盘为例,各版本路径如下: VS2015:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTempla ...

  3. C++/CLI中的const literal initonly 友元(转)

    C++/CLI中的const literal initonly 友元 C++/CLI中的const Visual C++并不允许在const对象上调用成员函数,除非该成员函数也被声明为const. C ...

  4. Java接口中的成员变量为什么必须声明为public static final?

    我想对于每个Java程序员来说,接口都不陌生,接口中的方法也经常使用.而接口中的成员变量,就显得用得少一点,而对于成员变量为什么必须声明为public static final,可能就更不清楚了,而且 ...

  5. YTU 2618: B 求类中数据成员的最大值-类模板

    2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec  内存限制: 128 MB 提交: 430  解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...

  6. java多态中哪些成员具备多态特性

    在多态的学习中,当子类继承父类时,子类中的变量哪些具备多态特性,哪些不具备多特特性. 代码: class Father{ public static int x=10; public int y=11 ...

  7. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

  8. 接口中的成员变量必须是static

    首先要弄清接口的含义. 接口就是提供一种统一的'协议’, 而接口中的属性也属于'协议’中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public st ...

  9. 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

    本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...

随机推荐

  1. jenkins 发送邮件失败

    jenkins 配置发送邮件,发送测试邮件,邮件发送失败: Failed to send out e-mail javax.mail.MessagingException: Could not con ...

  2. keras在win7下环境搭建

    无gpu安装过程:一.卸载之前版本.  把之前单独安装的Python等统统卸载掉.学python的时候直接安装了python2.7,先把他卸载掉,因为Anaconda里边包含了python.二.安装A ...

  3. unity 设置屏幕尺寸

    在PlayerSettings中将web player的screen size设成600x900后,需要在Game视图下拉菜单中选Web(600x900),Game视图才能显示成我们设定的尺寸.

  4. Python之反射练习

    # 什么是反射?可以用字符串的方式去访问对象的属性 class Test(): _name = "sss" def fun(self): return "Hellowor ...

  5. ASP.NET 解决URL中文乱码的解决

    暂时先记录一个方法: 在Web.config文件中configuration下的system.web下加入一个配置项:globalization,主要是设置其requestEncoding,貌似中文系 ...

  6. 《Android源代码设计模式解析与实战》读书笔记(二十)

    第二十章.适配器模式 适配器模式是结构型设计模式之中的一个,它在我们的开发中使用率极高,比方ListView.GridView以及RecyclerView都须要使用Adapter. 1.定义 适配器模 ...

  7. Windows下打造Sublime Text + Tex Live环境

    一直在用Sublime Text + ctex集成环境编写Latex文档,最近发现ctex套件内嵌的MiKTeX包管理器功能太弱了,遂将目标转向了功能更加强大的Tex Live环境. 首先安装Tex ...

  8. ubuntu 清理系统垃圾与备份

    虽然linux下不会有windows下的那么多垃圾和磁盘碎片!但还是会留下一些用不着的临时文件或是多次升级后的N个旧的内核! 1,非常有用的清理命令:sudo apt-get autocleansud ...

  9. iOS-ARC_Xcode检测循环引用

    iOS-ARC_Xcode检测循环引用 一,在桌面上新建立一个工程,在ViewController.m中输入如下代码: - (void)viewDidLoad { [super viewDidLoad ...

  10. 20个可能你不知道Linux网路工具

    如果要在你的系统上监控网络,那么使用命令行工具是非常实用的,并且对于 Linux 用户来说,有着许许多多现成的工具可以使用,如: nethogs, ntopng, nload, iftop, iptr ...