【问题标题】:Operator<< in C++ with custom Data Structures具有自定义数据结构的 C++ 中的运算符<<
【发布时间】:2015-04-05 09:58:33
【问题描述】:

我正在尝试制作一组​​自定义头文件以使用通用 List 并使用 operator

我正在尝试使用通用 Node 类创建通用 List 类。应使用 operator

#include <iostream>
using std::cout;
using std::ostream;

class List;

template<class T>
class Node
{
    friend class List<Node>;
    private:
    T data_;
    Node *next_;

    public:
    Node(T data);
    T get_data();
};

template<typename T>
Node<T>::Node(T data)
{
    data_ = data;
    next_ = 0;
}

template<typename T>
T Node<T>::get_data()
{
     return data_;
}

template<typename T>
class Node;

template<typename T>
class List
{
    template<typename T>
    friend ostream& operator<<(ostream& o , const List<T> head);

    private:
    Node<T> *start_;
    bool is_empty();

    public:
    List();
    ~List();
    void insert(T data);
    void remove();  
};

template<typename T>
bool List<T>::is_empty()
{
    if(start_ == 0)
        return true;        
    return false;
}

template<typename T>
List<T>::List()
{
    start_ = 0;
}

template<typename T>
List<T>::~List()
{
    if( !is_empty())
    {
        Node<T> *current = start_;
        Node<T> *temp;
        while(current != 0)
        {
            temp = current;
            current = current->next_;
            delete temp;
        }
    }
}

template<typename T>
void List<T>::insert(T data)
{
    if(is_empty())
    {
        Node<T> *temp = new Node<T>(data);
        start_ = temp;
    }
    else
    {
        Node<T> *temp = start_;
        while(temp->next_ != 0)
        {
            temp = temp->next_;
        }
        temp->next_ = new Node<T>(data);
    }
}

template<typename T>
void List<T>::remove()
{
    if(start_->next_ == 0)
    {
        Node<T> *temp = start_->next_;
        start_->next_ = 0;
        delete temp; 
    }
    else if(!is_empty())
    {
        Node<T> *stay = start_;
        Node<T> *remove = stay->next_;
        while(remove->next_ != 0)
        {
            stay = remove;
            remove = remove->next_;
        }
        stay->next_ = 0;
        delete remove;
    }
}


 // Experimental Stuff out here
template<typename T>
ostream& operator<<(ostream& o , const List<T> *head)
{
    Node<T> *temp = head->start_;
    if(!is_empty<T>())
    {
        while(temp->next_ != 0)
        {
            o << temp.get_data() << "\t";
            o << "\n";
            temp = temp->next_;
        }
    }
    return o;
}
//  End of Experimental Stuff

【问题讨论】:

  • 您遇到了什么错误?您可能会阅读此内容:stackoverflow.com/questions/4421706/operator-overloading
  • temp.get_data() 这应该是 temp->get_data(),因为 temp 是一个指针
  • 这里没有与运算符重载相关的编译器错误。
  • 如果您需要有关重载运算符的帮助,请删除所有不相关的代码(请参阅sscce.org)并分享错误消息!

标签: c++ oop object c++11


【解决方案1】:

假设你的类的客户像这样实例化它:

List<int> my_list;

您需要像这样定义operator &lt;&lt; 重载:

template <typename T>
std::ostream& operator << (std::ostream& os, const List<T>& list)
{
    // I'm gonna assume you have C++11
    auto node = list.start_;
    while (node != nullptr)
    {
        os << '\t' << node->get_data() << '\n';
        node = node->next_;
    }
    return os;
}

另外,您的代码中有很多关于模板的错误,所以请先修复它们。

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多