C++ 在单个节点中有两个项目的链接节点

C++ 在单个节点中有两个项目的链接节点,c++,nodes,C++,Nodes,如何创建链接节点,使每个链接节点在单个节点中包含2个项目?我不确定我走的方向是否正确。我的类中有2个私有成员,我不确定是否需要2个集合函数,或者是否可以有一个带有2个参数的集合函数。例如void setItem(常量字符串&anItem,常量字符串secondItem) \ifndef\u节点 #定义_节点 #包括 使用名称空间std; 类节点 { 私人: 字符串项;//数据项 Node*next;//指向下一个节点的指针 公众: Node(); 节点(常量字符串和anItem); 节点(常量字

如何创建链接节点,使每个链接节点在单个节点中包含2个项目?我不确定我走的方向是否正确。我的类中有2个私有成员,我不确定是否需要2个集合函数,或者是否可以有一个带有2个参数的集合函数。例如
void setItem(常量字符串&anItem,常量字符串secondItem)

\ifndef\u节点
#定义_节点
#包括
使用名称空间std;
类节点
{
私人:
字符串项;//数据项
Node*next;//指向下一个节点的指针
公众:
Node();
节点(常量字符串和anItem);
节点(常量字符串和anItem,节点*nextNodePtr);
无效集合项(常量字符串和anItem);
void setNext(节点*nextNodePtr);
字符串getItem()常量;
节点*getNext()常量;
}; // 端节点
#包括“Node.cpp”
#恩迪夫
这是我的Node.cpp文件:

#include "Node.h"
#include <cstddef>
#include<string>

using namespace std;

Node::Node() : next(nullptr)
{
} // end default constructor

Node::Node(const string& anItem) : item(anItem),  next(nullptr)
{
} // end constructor

Node::Node(const string& anItem, Node* nextNodePtr) :
            item(anItem), next(nextNodePtr)
{
} // end constructor

void Node::setItem(const string& anItem)
{
   item = anItem;

} // end setItem

void Node::setNext(Node* nextNodePtr)
{
   next = nextNodePtr;
} // end setNext

string Node::getItem() const
{
   return item;
} // end getItem


Node* Node::getNext() const
{
   return next;
} // end getNext
#包括“Node.h”
#包括
#包括
使用名称空间std;
Node::Node():下一个(nullptr)
{
}//结束默认构造函数
节点::节点(常量字符串和anItem):项(anItem),下一个(nullptr)
{
}//结束构造函数
Node::Node(常量字符串和anItem,Node*nextNodePtr):
项目(项目),下一个(下一个订单)
{
}//结束构造函数
void节点::setItem(常量字符串和anItem)
{
项目=项目;
}//结束集合项
void节点::setNext(节点*nextNodePtr)
{
next=nextNodePtr;
}//结束设置下一步
字符串节点::getItem()常量
{
退货项目;
}//结束getItem
Node*Node::getNext()常量
{
下一步返回;
}//结束getNext

对于我来说,我会选择两个公共函数来设置节点的两项。一个函数将只修改一个项目,而另一个函数将修改两个项目。比如:

// Function that will only set one item
void Node::setIndexItem(const int propNum, const string val)
{
    if (propNum == 1) { // You may use 0 for the first item
        this.item = val;
    } else if (propNum == 2) { // You may use 1 for the second item
        this.item2 = val;
    } else {
        // You may want to raise an exception here. Depends on you really.
    }
}

// Function that will set the two items
void Node::setItems(const string val1, const string val2)
{
    this.item = val1;
    this.item2 = val2;
}

在您的情况下,我将为数据创建一个专用类

struct DataNode
{
    std::string key;
    std::string value;
};
将班级职责分开(列表可能集中在链接节点)。 这将允许您在不更改类列表的情况下修改数据类型(模板化列表更好,但超出范围)

然后,您的节点类将类似于:

class Node
{
private:
   DataNode data;
   Node* next; // Pointer to next node // I assume you can't use unique_ptr :-/
public:
   Node();
   Node(const DataNode& data);
   Node(const DataNode& data, Node* nextNodePtr);

   // Rule of 3
   Node(const Node& rhs);
   ~Node();
   Node& operator =(const Node& rhs);

   // data accessor
   void setItem(const DataNode& data);
   const DataNode& getItem() const;
   DataNode& getItem();

   // Internal utility
   void setNext(Node* nextNodePtr);
   const Node* getNext() const;
   Node* getNext();
};
我添加了非常量版本的getter,以允许修改项目的一部分:

node.getItem().value = "new value";

您不应该
#包括“Node.cpp”
并避免
使用名称空间std >在头上。除非是作业,否则您可以考虑<代码> STD::List< <代码>或替换<代码> STD::配对< /代码>,用适当的<代码>结构> <代码> @ JAROD42,它正好适用于HW,我想要一个链表,每个节点包含2个项目,因为更大的情况是,我需要在列表中存储一个键和值,因为我正在处理字典ADT。有什么建议吗?你可以有
setItem1
setItem2
,或者
setItems
,或者两者都有。问题是如何使用这段代码,特别是一项更改而非另一项的频率。@Jarod42我有一个包含2个私有数据项的pair类,但我不知道如何使pair类与我的list类和node类一起工作。My list类用于添加、删除、查找数据,etcI将避免使用可能出错的
setIndexItem
,而类似于2种方法的替代方法更安全、更简单。
node.getItem().value = "new value";