鱼C论坛

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

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

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

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

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

x
#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[stacksize];
    }
    ~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[top++] = 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[len];
    }
    ~Vector()
    {
        delete[] items;
        items = NULL;
    };
    void resize(int size)
    {
        if (size <= len)
        {
            return;
        }
        T* tmp = new T[size];
        for (size_t i = 0; i < len; i++)
        {
            tmp[i] = items[i];
        }
        delete[] items;
        items = tmp;
        tmp = NULL;
        len = size;
    }
    int size()
    {
        return len;
    }
    T& operator[](int i)
    {
        if (i > len)
        {
            resize(i + 1);
        }
        return items[i];
    }
    const T& operator[](int i)const
    {
        return items[i];
    }
};



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

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

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

类 "Stack<std::string>" 包含多个默认构造函数        这是咋回事?       
最佳答案
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];` 来分配一个大小为 `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)`,因为我们在这里想实现的是下标运算符。

下面是修正后的部分代码:
#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[stacksize];
    }
    ~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[top++] = 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[len];
    }
    ~Vector() {
        delete[] items;
        items = NULL;
    }
    void resize(int size) {
        if (size > len) {
            T* newItems = new T[size];
            for (int i = 0; i < len; ++i) {
                newItems[i] = items[i];
            }
            delete[] items;
            items = newItems;
            len = size;
        }
    }
    const T& operator[](int i) const {
        return items[i];
    }
};

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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];` 来分配一个大小为 `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)`,因为我们在这里想实现的是下标运算符。

下面是修正后的部分代码:
#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[stacksize];
    }
    ~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[top++] = 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[len];
    }
    ~Vector() {
        delete[] items;
        items = NULL;
    }
    void resize(int size) {
        if (size > len) {
            T* newItems = new T[size];
            for (int i = 0; i < len; ++i) {
                newItems[i] = items[i];
            }
            delete[] items;
            items = newItems;
            len = size;
        }
    }
    const T& operator[](int i) const {
        return items[i];
    }
};

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[size]), 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[top++] = 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-8 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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