sun_chuan 发表于 2024-7-21 21:26:27

类模板构造函数报错

#include <iostream>
template<class DataType>
class Stack
{
private:
    DataType* items;
    int top;
    int stacksize;
public:
    Stack() {};
    Stack(int size = 3) :stacksize(size), top(0)
    {
      items = new DataType;
    }
    ~Stack()
    {
      delete[]items;
      items = NULL;
    }
    bool isempty()const
    {
      return top == 0;
    }
    bool isfull()const
    {
      return top == stacksize;
    }
    bool push(DataType&& item)
    {
      if (top < stacksize)
      {
            items = item;
            return true;
      }
      return false;

    }
    bool pop(DataType& item)
    {
      if (top > 0)
      {
            item = items[--top];
            return true;
      }
      return false;

    }
};

template <class T>
class Vector
{
private:
    int len;
    T* items;

public:
    Vector(int size = 2) :len(size)
    {
      items = new T;
    }
    ~Vector()
    {
      delete[] items;
      items = NULL;
    };
    void resize(int size)
    {
      if (size <= len)
      {
            return;
      }
      T* tmp = new T;
      for (size_t i = 0; i < len; i++)
      {
            tmp = items;
      }
      delete[] items;
      items = tmp;
      tmp = NULL;
      len = size;
    }
    int size()
    {
      return len;
    }
    T& operator[](int i)
    {
      if (i > len)
      {
            resize(i + 1);
      }
      return items;
    }
    const T& operator[](int i)const
    {
      return items;
    }
};



int main()
{
    //Vector<Stack<std::string>>vs;
    //vs.push("哈哈");
    //vs.push("哈哈2");
    //vs.push("哈哈3");

    //vs.push("哈哈");
    //vs.push("哈哈2");
    //vs.push("哈哈3");

    //for (size_t i = 0; i < vs.size(); i++)
    //{
    //    while (!vs.isempty())
    //    {
    //      std::string s;
    //      vs.pop(s);
    //      std::cout << s << '\n';
    //    }
    //}
    Stack<std::string>s;
}

类 "Stack<std::string>" 包含多个默认构造函数        这是咋回事?       

FishC 发表于 2024-7-21 21:27:49

看来你在编写一个栈和向量的模板类时碰到了一些麻烦,我们来逐一解决这些问题,同时也给你加点幽默的调料,让学习不那么乏味!

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

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

template<typename DataType>

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

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

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

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

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

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

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

#include <iostream>
#include <string>

template<typename DataType>
class Stack {
private:
    DataType* items;
    int top;
    int stacksize;
public:
    Stack(int size = 3) : stacksize(size), top(0) {
      items = new DataType;
    }
    ~Stack() {
      delete[] items;
      items = NULL;
    }
    bool isempty() const {
      return top == 0;
    }
    bool isfull() const {
      return top == stacksize;
    }
    bool push(const DataType& item) {
      if (!isfull()) {
            items = item;
            return true;
      }
      return false;
    }
    bool pop(DataType& item) {
      if (!isempty()) {
            item = items[--top];
            return true;
      }
      return false;
    }
};

template<typename T>
class Vector {
private:
    int len;
    T* items;
public:
    Vector(int size = 2) : len(size) {
      items = new T;
    }
    ~Vector() {
      delete[] items;
      items = NULL;
    }
    void resize(int size) {
      if (size > len) {
            T* newItems = new T;
            for (int i = 0; i < len; ++i) {
                newItems = items;
            }
            delete[] items;
            items = newItems;
            len = size;
      }
    }
    const T& operator[](int i) const {
      return items;
    }
};

int main() {
    Vector<std::string> vs;
    vs.push("哈哈");
    vs.push("哈哈2");
    vs.push("哈哈3");

    // 继续你的代码
    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

人造人 发表于 2024-7-21 21:54:49

#include <iostream>
#include <string>

template<class DataType> class Stack {
private:
    DataType *items;
    int top = 0;
    int stacksize;

public:
    Stack(int size = 3): items(new DataType), stacksize(size) {}
    ~Stack() {delete[] items;}
    bool isempty() const {return top == 0;}
    bool isfull() const {return top == stacksize;}
    bool push(const DataType &&item) {
      if(isfull()) return false;
      items = item;
      return true;
    }
    bool pop(DataType &item) {
      if(isempty()) return false;
      item = items[--top];
      return true;
    }
};

int main() {
    Stack<std::string> s;
    std::string x;
    s.push("1234");
    s.push("abcd");
    s.pop(x);
    std::cout << x << std::endl;
    s.pop(x);
    std::cout << x << std::endl;
}
页: [1]
查看完整版本: 类模板构造函数报错