0

それで、Linked List から移動して、Linked Stack を構築する必要があります。ただし、プライベートメンバーにアクセスできないというアクセスエラーが発生します。ポインターをコピーできない一意のポインター内のコンストラクターに関係していることはわかっています。男の 1 人は、コンストラクターのディープ コピーを行うように私に言いましたが、方法がわかりません。誰かが私にそれを行う方法を教えてくれませんか? ありがとうございました。

PS: これは私が今日投稿したものです。しかし、私はまだ自分自身に答えを持っていません.誰も私に答えてくれないようです. これが再投稿だと思われる場合は、お気軽に削除してください。

LinkNode.h

#include <iostream>
#include <memory>
using namespace std;

template <class T>
class LinkedNode 
{

    public:
            // This is giving me error and I do not know how to recreate
            // or deep-copy the constructor
        LinkedNode(T newElement, unique_ptr<LinkedNode<T>> newNext)
        {
                element = newElement;
                next = newNext  
        }

        T GetElement() {return element;}

        void SetElement(T x) {element = x;}

        unique_ptr<LinkedNode<T>> newNext() {return next;}

        void SetNext(unique_ptr<LinkedNode<T>> newNext) {next = newNext;}

    private:
        T element;
        unique_ptr<LinkedNode<T>> next;
};

CompactStack.h

#pragma once
#include"LinkedNode.h"

using namespace std;

template <class T>
class CompactStack 
{

    public:

        CompactStack() {}
        bool IsEmpty() const { return head == 0; }

        T Peek() 
        {
            assert(!IsEmpty());
            return head-> GetElement();
        }

        void Push(T x) 
        {
            unique_ptr<LinkedNode<T>> newhead(new LinkedNode<T>(x, head));
            head.swap(newhead);
        }

        void Pop() 
        {
            assert(!IsEmpty());
            unique_ptr<LinkedNode<T>> oldhead = head;
            head = head->next();
        }

        void Clear() 
        {
            while (!IsEmpty())
            Pop();
        }

    private:
        unique_ptr<LinkedNode<T>> head;
};

これは、コンパイラから得たエラーです

Error   1   error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>' e:\fall 2013\cpsc 131\hw4\hw4\hw4\compactstack.h    23
4

2 に答える 2

2

unique_ptrmoveある unique_ptr から別の unique_ptr に転送するために使用する必要があります。以下に、コンパイルに必要なすべての動きを追加しました。移動後、元のオブジェクトは有効ですが不明な状態になることに注意してください。これはPop()方法において重要です。

ヘッダーを入れるのも悪い習慣なusing namespaceので、それらは削除されました。

LinkedNode.h

#pragma once
#include <memory>

template <class T>
class LinkedNode
{
public:
    LinkedNode(T newElement, std::unique_ptr<LinkedNode<T>> newNext)
    {
        element = newElement;
        next = move(newNext);
    }
    T GetElement() {return element;}
    void SetElement(T x) {element = x;}
    std::unique_ptr<LinkedNode<T>> newNext() {return move(next);}
    void SetNext(std::unique_ptr<LinkedNode<T>> newNext) {next = move(newNext);}

private:
    T element;
    std::unique_ptr<LinkedNode<T>> next;
};

CompactStack.h

#pragma once
#include <cassert>
#include"LinkedNode.h"

template <class T>
class CompactStack
{
public:
    CompactStack() {}
    bool IsEmpty() const { return head == nullptr; }
    T Peek()
    {
        assert(!IsEmpty());
        return head-> GetElement();
    }
    void Push(T x)
    {
        std::unique_ptr<LinkedNode<T>> newhead(new LinkedNode<T>(x, move(head)));
        head.swap(newhead);
    }
    void Pop()
    {
        assert(!IsEmpty());
        std::unique_ptr<LinkedNode<T>> oldhead = move(head);
        head = oldhead->newNext(); // head no longer valid after move, use oldhead
        // oldhead->next no longer valid, but local variable going out of scope anyway.
    }
    void Clear()
    {
        while(!IsEmpty())
            Pop();
    }
private:
    std::unique_ptr<LinkedNode<T>> head;
};

上記は簡単なテストで動作します:

#include <iostream>
#include "CompactStack.h"
using namespace std;
int main()
{
    CompactStack<int> cs;
    cout << "IsEmpty " << cs.IsEmpty() << endl;
    cs.Push(1);
    cout << "IsEmpty " << cs.IsEmpty() << endl;
    cout << "Peek " << cs.Peek() << endl;
    cs.Push(2);
    cout << "IsEmpty " << cs.IsEmpty() << endl;
    cout << "Peek " << cs.Peek() << endl;
    cs.Push(3);
    cout << "IsEmpty " << cs.IsEmpty() << endl;
    cout << "Peek " << cs.Peek() << endl;
    cs.Pop();
    cout << "IsEmpty " << cs.IsEmpty() << endl;
    cout << "Peek " << cs.Peek() << endl;
    cs.Clear();
    cout << "IsEmpty " << cs.IsEmpty() << endl;
}

出力

IsEmpty 1
IsEmpty 0
Peek 1
IsEmpty 0
Peek 2
IsEmpty 0
Peek 3
IsEmpty 0
Peek 2
IsEmpty 1
于 2013-10-08T04:38:19.300 に答える