鱼C论坛

 找回密码
 立即注册
查看: 889|回复: 2

[已解决]类模板构造函数报错

[复制链接]
发表于 2024-7-21 21:26:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <iostream>
  2. template<class DataType>
  3. class Stack
  4. {
  5. private:
  6.     DataType* items;
  7.     int top;
  8.     int stacksize;
  9. public:
  10.     Stack() {};
  11.     Stack(int size = 3) :stacksize(size), top(0)
  12.     {
  13.         items = new DataType[stacksize];
  14.     }
  15.     ~Stack()
  16.     {
  17.         delete[]items;
  18.         items = NULL;
  19.     }
  20.     bool isempty()const
  21.     {
  22.         return top == 0;
  23.     }
  24.     bool isfull()const
  25.     {
  26.         return top == stacksize;
  27.     }
  28.     bool push(DataType&& item)
  29.     {
  30.         if (top < stacksize)
  31.         {
  32.             items[top++] = item;
  33.             return true;
  34.         }
  35.         return false;

  36.     }
  37.     bool pop(DataType& item)
  38.     {
  39.         if (top > 0)
  40.         {
  41.             item = items[--top];
  42.             return true;
  43.         }
  44.         return false;

  45.     }
  46. };

  47. template <class T>
  48. class Vector
  49. {
  50. private:
  51.     int len;
  52.     T* items;

  53. public:
  54.     Vector(int size = 2) :len(size)
  55.     {
  56.         items = new T[len];
  57.     }
  58.     ~Vector()
  59.     {
  60.         delete[] items;
  61.         items = NULL;
  62.     };
  63.     void resize(int size)
  64.     {
  65.         if (size <= len)
  66.         {
  67.             return;
  68.         }
  69.         T* tmp = new T[size];
  70.         for (size_t i = 0; i < len; i++)
  71.         {
  72.             tmp[i] = items[i];
  73.         }
  74.         delete[] items;
  75.         items = tmp;
  76.         tmp = NULL;
  77.         len = size;
  78.     }
  79.     int size()
  80.     {
  81.         return len;
  82.     }
  83.     T& operator[](int i)
  84.     {
  85.         if (i > len)
  86.         {
  87.             resize(i + 1);
  88.         }
  89.         return items[i];
  90.     }
  91.     const T& operator[](int i)const
  92.     {
  93.         return items[i];
  94.     }
  95. };



  96. int main()
  97. {
  98.     //Vector<Stack<std::string>>vs;
  99.     //vs[0].push("哈哈");
  100.     //vs[0].push("哈哈2");
  101.     //vs[0].push("哈哈3");

  102.     //vs[1].push("哈哈");
  103.     //vs[1].push("哈哈2");
  104.     //vs[1].push("哈哈3");

  105.     //for (size_t i = 0; i < vs.size(); i++)
  106.     //{
  107.     //    while (!vs[i].isempty())
  108.     //    {
  109.     //        std::string s;
  110.     //        vs[i].pop(s);
  111.     //        std::cout << s << '\n';
  112.     //    }
  113.     //}
  114.     Stack<std::string>s;
  115. }
复制代码


类 "Stack<std::string>" 包含多个默认构造函数        这是咋回事?       
最佳答案
2024-7-21 21:27:49
看来你在编写一个栈和向量的模板类时碰到了一些麻烦,我们来逐一解决这些问题,同时也给你加点幽默的调料,让学习不那么乏味!

### 1. 缺少 `#include` 语句
你在文件开头忘了引入必要的头文件,比如 `#include <iostream>` 和 `#include <string>`。在C++中,如果不引入标准库,编译器可会很生气,甚至会发出“你想让我干啥”的愤怒咆哮!

### 2. 数据类型帧问题
在你的 `Stack` 和 `Vector` 类中,我们看到了 `DataType` 和 `T` 这两个神秘的字符,但并没有具体定义它们。请确保在模板声明中定义好数据类型。

  1. template<typename DataType>
复制代码


  1. template<typename T>
复制代码

这样才能让编译器知道你指的是哪个类型,避免在计算机眼中显得你像个不知所措的小白鼠。

### 3. 内存分配错误
在构造函数中,你使用 `new DataType;`,这会分配一个单独的对象,而不是一个数组。应该用 `new DataType[stacksize];` 来分配一个大小为 `stacksize` 的数组。这就像买了一个大冰箱却只放进去一个冰淇淋球,那可就太浪费空间了!

### 4. 解构函数中的错误
在解构函数中,应该用 `delete[] items;` 而不是 `delete items;`,以正确释放数组分配的内存。人不能随便吃东西,电脑也不能随便“回收”内存。

### 5. 其他小问题
- 在 `push` 方法中,应使用 `items[top++] = item;`,而不是 `items = item;`,否则你只是在交换内存地址,根本没把新元素放进栈里。
- `pop` 方法中,应该使用 `item = items[--top];` 以此返回最新的元素,同时减少栈顶的索引。

### 6. 语法错误
在 `resize` 函数中,你有个小错误。你需要用 `if (size > len)` 而不是 `if (size len)`。记住,在编程中,符号“>”就像是个大喇叭,能帮你发出清晰的信号。

### 7. `operator` 重载
`operator(int i)` 是不正确的。请把它改成 `operator[](int i)`,因为我们在这里想实现的是下标运算符。

下面是修正后的部分代码:

  1. #include <iostream>
  2. #include <string>

  3. template<typename DataType>
  4. class Stack {
  5. private:
  6.     DataType* items;
  7.     int top;
  8.     int stacksize;
  9. public:
  10.     Stack(int size = 3) : stacksize(size), top(0) {
  11.         items = new DataType[stacksize];
  12.     }
  13.     ~Stack() {
  14.         delete[] items;
  15.         items = NULL;
  16.     }
  17.     bool isempty() const {
  18.         return top == 0;
  19.     }
  20.     bool isfull() const {
  21.         return top == stacksize;
  22.     }
  23.     bool push(const DataType& item) {
  24.         if (!isfull()) {
  25.             items[top++] = item;
  26.             return true;
  27.         }
  28.         return false;
  29.     }
  30.     bool pop(DataType& item) {
  31.         if (!isempty()) {
  32.             item = items[--top];
  33.             return true;
  34.         }
  35.         return false;
  36.     }
  37. };

  38. template<typename T>
  39. class Vector {
  40. private:
  41.     int len;
  42.     T* items;
  43. public:
  44.     Vector(int size = 2) : len(size) {
  45.         items = new T[len];
  46.     }
  47.     ~Vector() {
  48.         delete[] items;
  49.         items = NULL;
  50.     }
  51.     void resize(int size) {
  52.         if (size > len) {
  53.             T* newItems = new T[size];
  54.             for (int i = 0; i < len; ++i) {
  55.                 newItems[i] = items[i];
  56.             }
  57.             delete[] items;
  58.             items = newItems;
  59.             len = size;
  60.         }
  61.     }
  62.     const T& operator[](int i) const {
  63.         return items[i];
  64.     }
  65. };

  66. int main() {
  67.     Vector<std::string> vs;
  68.     vs.push("哈哈");
  69.     vs.push("哈哈2");
  70.     vs.push("哈哈3");

  71.     // 继续你的代码
  72.     return 0;
  73. }
复制代码


希望这些信息能帮到你!如果还有什么疑问,尽管问我,我可是随时待命的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-21 21:27:49 | 显示全部楼层    本楼为最佳答案   
看来你在编写一个栈和向量的模板类时碰到了一些麻烦,我们来逐一解决这些问题,同时也给你加点幽默的调料,让学习不那么乏味!

### 1. 缺少 `#include` 语句
你在文件开头忘了引入必要的头文件,比如 `#include <iostream>` 和 `#include <string>`。在C++中,如果不引入标准库,编译器可会很生气,甚至会发出“你想让我干啥”的愤怒咆哮!

### 2. 数据类型帧问题
在你的 `Stack` 和 `Vector` 类中,我们看到了 `DataType` 和 `T` 这两个神秘的字符,但并没有具体定义它们。请确保在模板声明中定义好数据类型。

  1. template<typename DataType>
复制代码


  1. template<typename T>
复制代码

这样才能让编译器知道你指的是哪个类型,避免在计算机眼中显得你像个不知所措的小白鼠。

### 3. 内存分配错误
在构造函数中,你使用 `new DataType;`,这会分配一个单独的对象,而不是一个数组。应该用 `new DataType[stacksize];` 来分配一个大小为 `stacksize` 的数组。这就像买了一个大冰箱却只放进去一个冰淇淋球,那可就太浪费空间了!

### 4. 解构函数中的错误
在解构函数中,应该用 `delete[] items;` 而不是 `delete items;`,以正确释放数组分配的内存。人不能随便吃东西,电脑也不能随便“回收”内存。

### 5. 其他小问题
- 在 `push` 方法中,应使用 `items[top++] = item;`,而不是 `items = item;`,否则你只是在交换内存地址,根本没把新元素放进栈里。
- `pop` 方法中,应该使用 `item = items[--top];` 以此返回最新的元素,同时减少栈顶的索引。

### 6. 语法错误
在 `resize` 函数中,你有个小错误。你需要用 `if (size > len)` 而不是 `if (size len)`。记住,在编程中,符号“>”就像是个大喇叭,能帮你发出清晰的信号。

### 7. `operator` 重载
`operator(int i)` 是不正确的。请把它改成 `operator[](int i)`,因为我们在这里想实现的是下标运算符。

下面是修正后的部分代码:

  1. #include <iostream>
  2. #include <string>

  3. template<typename DataType>
  4. class Stack {
  5. private:
  6.     DataType* items;
  7.     int top;
  8.     int stacksize;
  9. public:
  10.     Stack(int size = 3) : stacksize(size), top(0) {
  11.         items = new DataType[stacksize];
  12.     }
  13.     ~Stack() {
  14.         delete[] items;
  15.         items = NULL;
  16.     }
  17.     bool isempty() const {
  18.         return top == 0;
  19.     }
  20.     bool isfull() const {
  21.         return top == stacksize;
  22.     }
  23.     bool push(const DataType& item) {
  24.         if (!isfull()) {
  25.             items[top++] = item;
  26.             return true;
  27.         }
  28.         return false;
  29.     }
  30.     bool pop(DataType& item) {
  31.         if (!isempty()) {
  32.             item = items[--top];
  33.             return true;
  34.         }
  35.         return false;
  36.     }
  37. };

  38. template<typename T>
  39. class Vector {
  40. private:
  41.     int len;
  42.     T* items;
  43. public:
  44.     Vector(int size = 2) : len(size) {
  45.         items = new T[len];
  46.     }
  47.     ~Vector() {
  48.         delete[] items;
  49.         items = NULL;
  50.     }
  51.     void resize(int size) {
  52.         if (size > len) {
  53.             T* newItems = new T[size];
  54.             for (int i = 0; i < len; ++i) {
  55.                 newItems[i] = items[i];
  56.             }
  57.             delete[] items;
  58.             items = newItems;
  59.             len = size;
  60.         }
  61.     }
  62.     const T& operator[](int i) const {
  63.         return items[i];
  64.     }
  65. };

  66. int main() {
  67.     Vector<std::string> vs;
  68.     vs.push("哈哈");
  69.     vs.push("哈哈2");
  70.     vs.push("哈哈3");

  71.     // 继续你的代码
  72.     return 0;
  73. }
复制代码


希望这些信息能帮到你!如果还有什么疑问,尽管问我,我可是随时待命的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-21 21:54:49 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>

  3. template<class DataType> class Stack {
  4. private:
  5.     DataType *items;
  6.     int top = 0;
  7.     int stacksize;

  8. public:
  9.     Stack(int size = 3): items(new DataType[size]), stacksize(size) {}
  10.     ~Stack() {delete[] items;}
  11.     bool isempty() const {return top == 0;}
  12.     bool isfull() const {return top == stacksize;}
  13.     bool push(const DataType &&item) {
  14.         if(isfull()) return false;
  15.         items[top++] = item;
  16.         return true;
  17.     }
  18.     bool pop(DataType &item) {
  19.         if(isempty()) return false;
  20.         item = items[--top];
  21.         return true;
  22.     }
  23. };

  24. int main() {
  25.     Stack<std::string> s;
  26.     std::string x;
  27.     s.push("1234");
  28.     s.push("abcd");
  29.     s.pop(x);
  30.     std::cout << x << std::endl;
  31.     s.pop(x);
  32.     std::cout << x << std::endl;
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 09:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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