我不完全确定我在哪里出错了但是我一直在为Push增加奇怪的价值。 我不知道我的错误是在Push本身还是在Display中,但我认为它是在Push中。请注意,Push here应该类似于“std :: deque :: push_back”。
以下是相关的实施代码:
fsu::Queue <char> q;
q.Push('a');
q.Display(std::cout, '\0');
这是我得到的:
0x100100a20
0x100100a20
0x0
相关定义:
void Push (const T& t); // push t onto queue
void Display (std::ostream& os, char ofc = '\0') const; // output contents
//through os
queue (); // default constructor
Queue (const Queue&); // copy constructor
~Queue (); // destructor
Queue& operator = (const Queue&); // assignment operator
private:
class Link
{
Link ( const T& t ); // 1-parameter constructor
T element_;
Link * nextLink_;
friend class Queue<T>;
};
Link * firstLink_;
Link * lastLink_;
void Copy (const Queue<T>& q);
static Link* NewLink(const T& t);
以下是我实施的内容:
template < typename T >
fsu::Queue<T>::Queue () : firstLink_(0), lastLink_(0) // default constructor
{
//empty
}
template < typename T >
fsu::Queue<T>::Queue (const Queue& q) : firstLink_(0), lastLink_(0)
{
Copy(q);
}
template < typename T >
fsu::Queue<T>& fsu::Queue<T>::operator = (const Queue& q) // assignment operator
{
if (this != &q)
{
Clear();
Copy(q);
}
return *this;
}
template < typename T >
fsu::Queue<T>::Link::Link ( const T& t ) : element_(t), nextLink_(0) // 1-parameter constructor
{
};
template < typename T >
typename fsu::Queue<T>::Link* fsu::Queue<T>::NewLink (const T& t)
{
Link * newLink = new(std::nothrow) Link (t);
if (0 == newLink)
{
// exception handler
std::cerr << "** Queue error: memory allocation failure\n";
return 0;
}
return newLink;
}
template < typename T >
void fsu::Queue<T>::Copy (const Queue<T>& q)
{
if (firstLink_ != 0)
{
std::cerr << "** Error: Queue::Copy called by non-empty object\n";
// exit(EXIT_FAILURE);
}
if (q.firstLink_ == 0)
return;
Link* qlink = q.firstLink_;
while (qlink != 0)
{
Push(qlink -> element_);
qlink = qlink -> nextLink_;
}
}
template < typename T >
void fsu::Queue<T>::Push (const T& t) // push t onto queue
{
if (Empty())
{
Link * newLink = new Link(t);
newLink -> nextLink_ = NULL;
firstLink_ = newLink;
lastLink_ = newLink;
}
else
{
//to be implemented
}
}
template < typename T >
void fsu::Queue<T>::Display (std::ostream& os, char ofc) const // output contents
// through os
{
os << firstLink_ << std::endl;
os << lastLink_ << std::endl;
Link * currLink = firstLink_;
while (currLink)
{
currLink = currLink -> nextLink_;
os << currLink << std::endl;
}
}
答案 0 :(得分:1)
os << firstLink_ << std::endl;
os << lastLink_ << std::endl;
打印指向的地址(即变量携带的值),而不是指向的项目。
你必须取消引用指针!然后你得到一个Link
结构,然后你必须选择你要打印的_element
成员:
os << (*firstLink_)._element << std::endl;
os << (*lastLink_).element << std::endl;
更短更常见:
os << firstLink_->_element << std::endl;
os << lastLink_->_element << std::endl;
明确取消引用的必要性是,例如Java和C#,其中引用被程序员“隐藏”并由语言处理。在C和C ++中,指针变量只保存一个内存地址。你可以直接操作内存地址(google用于“指针算术”);因此,有必要将指针值(即地址)与指向该值的值区分开来。
希望这不会太混乱。