鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 爱学习520

[已解决]VS2017找不到指定文件,百度一直未解决【30人民币悬赏】

[复制链接]
 楼主| 发表于 2020-8-8 17:03:59 | 显示全部楼层

按照你的修改了,你看下我帖子上面的图片,运行就是这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-8 17:09:35 | 显示全部楼层

我还是没有解决按照你说的,能给我远程看看吗,我给你发红包呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-8 17:09:58 | 显示全部楼层
不知道,我可以正常运行,我实现还是写在cpp上,声明写在.h上,只是出现主函数无法解析 加上#include "Vector.cpp"就可以正常运行
,没有出现你的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-8 17:51:55 | 显示全部楼层    本楼为最佳答案   
试了下,可以正常编译执行,下面是完整代码,三个文件,其中有几个小修改,
你复制完整代码看正常不。我是在VS2015下运行的。

//Vector.h
  1. #ifndef VECTOR_H_
  2. #define VECTOR_H_

  3. #define SUCCESS           1 // 成功                        
  4. #define ERROR            -1 // 失败                        
  5. #define MALLOC_ERROR     -2 // 申请内存失败                        
  6. #define INDEX_ERROR      -3 // 错误的索引号   

  7. template<class T_ELE>
  8. class Vector
  9. {
  10. private:
  11.     T_ELE *pVector;
  12.     int Len;
  13.     int Index;
  14.     int InitSize;
  15.     int Increment;
  16. public:
  17.     Vector<T_ELE>();
  18.     Vector<T_ELE>(int size);
  19.     ~Vector<T_ELE>();
  20.     int push_back(T_ELE Element);
  21.     bool expand();
  22.     int insert(int index, T_ELE Element);
  23. };
  24. #endif
复制代码


//Vector.cpp
  1. #include "Vector.h"

  2. template<class T_ELE>
  3. Vector<T_ELE>::Vector() : InitSize(100), Increment(5)
  4. {
  5.     //分配空间
  6.     //pVector = new T_ELE(InitSize);
  7.     pVector = new T_ELE[InitSize];
  8.     //初始化
  9.     memset(pVector, 0, InitSize * sizeof(T_ELE));
  10.     //其他变量初始化
  11.     Len = InitSize;
  12.     Index = 0;
  13. }

  14. template<class T_ELE>
  15. Vector<T_ELE>::Vector(int size) : Increment(5)  //增加了Increment(5)
  16. {
  17.     //分配空间
  18.     //pVector = new T_ELE(size);
  19.     pVector = new T_ELE[size];
  20.     //初始化
  21.     memset(pVector, 0, size * sizeof(T_ELE));
  22.     //其他变量初始化
  23.     Len = size;
  24.     Index = 0;
  25. }

  26. template<class T_ELE>
  27. Vector<T_ELE>::~Vector()
  28. {
  29.     //释放类对象里面申请的空间
  30.     delete[]pVector;
  31.     pVector = NULL;
  32. }

  33. template<class T_ELE>
  34. int Vector<T_ELE>::push_back(T_ELE Element)
  35. {
  36.     //判断是否需要增容
  37.     if (Index >= Len)
  38.     {
  39.         expand();
  40.     }
  41.     //将新元素放到最后一个位置
  42.     memcpy(&pVector[Index], &Element, sizeof(T_ELE));
  43.     //修改索引
  44.     Index++;
  45.     //返回成功
  46.     return SUCCESS;
  47. }
  48. //扩容
  49. template<class T_ELE>
  50. bool Vector<T_ELE>::expand()
  51. {
  52.     int tlen;
  53.     int* pNew;
  54.     //计算增加后的长度
  55.     tlen = Len + Increment;
  56.     //申请现在需要的空间
  57.     //pNew = new T_ELE(tlen);
  58.     pNew = new T_ELE[tlen];
  59.     //将数据复制到新空间
  60.     memcpy(pNew, pVector, Len*sizeof(T_ELE));
  61.     //释放原来的空间
  62.     delete[]pVector;
  63.     pVector = pNew;
  64.     pNew = NULL;
  65.     //修改其他变量值
  66.     Len = tlen;
  67.     return SUCCESS;
  68. }
  69. //插入数据
  70. template<class T_ELE>
  71. int Vector<T_ELE>::insert(int index, T_ELE Element)
  72. {
  73.     //判断索引是否在合理区间
  74.     if (index<0 || index>Index)
  75.         return INDEX_ERROR;
  76.     //判断是否需要扩容
  77.     if (Index >= Len)
  78.         expand();
  79.     //将索引后面的元素全部后移
  80.     for (int i = Index; i>index - 1; i--)
  81.         memcpy(&pVector[i], &pVector[i - 1], sizeof(T_ELE));

  82.     //将元素插入对应的位置
  83.     memcpy(&pVector[index - 1], &Element, sizeof(T_ELE));
  84.     //修改其他对应的参数
  85.     Index++;
  86. }
复制代码


//test.cpp
  1. #include<iostream>
  2. #include <string.h>
  3. #include "Vector.h"
  4. #include "Vector.cpp"                    

  5. using namespace std;

  6. //测试函数
  7. void TextVector()
  8. {
  9.     Vector<int>* p = new Vector<int>(5);
  10.     p->push_back(1);
  11.     p->push_back(2);
  12.     p->push_back(3);
  13.     p->push_back(4);
  14.     p->push_back(5);
  15.     p->push_back(6);

  16. }

  17. int main()
  18. {
  19.     TextVector();
  20.     return 0;
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-8 19:48:16 | 显示全部楼层
superbe 发表于 2020-8-8 17:51
试了下,可以正常编译执行,下面是完整代码,三个文件,其中有几个小修改,
你复制完整代码看正常不。我是 ...

非常感谢,你修改了哪里呀,能否标柱一下呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 09:43:31 | 显示全部楼层
本帖最后由 superbe 于 2020-8-9 09:47 编辑

修改的地方见Vector.cpp文件里的注释行:

第7行   pVector = new T_ELE(InitSize);
第20行  pVector = new T_ELE(size);
第61行  pNew = new T_ELE(tlen);
上面几行把new T_ELE后面的小括号改成了中括号,表示分配数组

第17行  Vector<T_ELE>::Vector(int size) : Increment(5)
这行增加了初始化Increment(5),避免调用Vector(int size)构造函数时Increment没有初始化,后面expand里就会出错。

头文件Vector.h里增加了三行预编译指令,防止重复包含:
#ifndef VECTOR_H_
#define VECTOR_H_
......
#endif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 10:19:34 | 显示全部楼层
superbe 发表于 2020-8-9 09:43
修改的地方见Vector.cpp文件里的注释行:

第7行   pVector = new T_ELE(InitSize);

好的,非常感谢你指出的错误。最后3个指令有个疑问,比如我写一个简单Person类,没有用这3个指令可以通过,如果用了这个指令会错误,比如这个目前可以正常运行。同样都是类,为什么我上面Vector的类去掉这3个指令就出错呀,而下面这个不会出错。这里真的很纳闷,希望能解答一下,非常感谢
Person.h

  1. #pragma once
  2. class Person
  3. {
  4. public:
  5.         int x;
  6. public:
  7.         Person();
  8.        
  9. };
复制代码


Person.cpp
  1. #include "Person.h"

  2. #include<iostream>
  3. using namespace std;

  4. Person::Person()
  5. {
  6.        
  7.         cout << "构造函数的实现" << endl;
  8. }
复制代码


main()
  1. #include <iostream>
  2. #include "Person.h"

  3. int main()
  4. {
  5.         Person p;       
  6. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 13:06:54 | 显示全部楼层
本帖最后由 superbe 于 2020-8-9 13:33 编辑

Person程序把#pragma once去掉仍然正常,是因为main文件里只包含了一次"Person.h",不会发生重复定义的问题。
Vector程序main文件有#include "Vector.h" 和 #include "Vector.cpp",而后者内部已经有了一行#include "Vector.h"。这样实际上在main文件里包含了两次Vector.h,所以发生重复定义class Vector的问题。
在Vector程序main文件中把#include "Vector.h"这行去掉(这里这行不必要),再把#ifndef VECTOR_H_等三行(或#pragma once)去掉也就正常了。

书上是建议把模板声明和定义放在同一个头文件中的,参考下《C++ Primer》中的说法:
通常,当我们调用一个函数时,编译器只需要掌握函数的声明。类似的,当我们使用一个类类型的对象时,类定义必须是可用的,但成员函数的定义不必已经出现。因此,我们将类定义和函数声明放在头文件中,而普通函数和类的成员函数的定义放在源文件中。
模板则不同:为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义。因此,与非模板代码不同,模板的头文件通常既包括声明也包括定义。
Note: 函数模板和类模板成员函数的定义通常放在头文件中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 14:25:50 | 显示全部楼层
superbe 发表于 2020-8-9 13:06
Person程序把#pragma once去掉仍然正常,是因为main文件里只包含了一次"Person.h",不会发生重复定义的问题 ...
在Vector程序main文件中把#include "Vector.h"这行去掉(这里这行不必要),再把#ifndef VECTOR_H_等三行(或#pragma once)去掉也就正常了。


试了一下这个可以。但是在Vector程序main文件中把#include "Vector.cpp"这行去掉,
保留Vector.h,把#ifndef VECTOR_H_等三行(或#pragma once)去掉,却不正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 16:44:30 | 显示全部楼层
你看错了,我说的是去掉#include "Vector.h",不是#include "Vector.cpp"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表