2

オブジェクト指向プログラミングに慣れるために、C++ で単純なリンク リスト クラスとその他のデータ構造を作成したいと考えていました。古い C コードを編集した後、次のようなものができました (関数の 1 つを含めただけです)。

template<typename T> class llist
{
    public:
        T data;
        llist<T>* next;

        llist() {next=nullptr;}
        llist(const T& d) {data=d;next=nullptr;}
};

template<class T> llist<T>** llistAdd(llist<T> **l,const T& d)
{
    llist<T> *temp=*l;
    (*l)=new llist<T>(d);
    (**l).next=temp;
    return &(**l).next;
}

次のように使用されます。

int main()
{
    llist<int>* my_integer_list = nullptr;

    llistAdd(&my_integer_list,42);
    llistAdd(&my_integer_list,128);
    llistAdd(&my_integer_list,1337);

    for(auto itr = &my_integer_list; (*itr) != nullptr; llistItrAdv(&itr))
        cout<<(**itr).data<<endl;

    llistClear(&my_integer_list);

    return 0;
}

これはすべて完璧に機能します。問題は、C++ OOP スタイルが のような関数の代わりにメソッドを使用することですllistAdd(..)。問題は、私のコードがポインタ ツー ポインタ、さらにはポインタ ツー ポインタ ツー ポインタで動作することです (「参考文献」を参照llistItrAdv(..))。メソッドを使用する場合、次のようなことをする必要があります。

template<typename T> llist<T>* llist<T>::Add(const T& d)
{
    llist<T> *temp = new llist<T>(d);
    temp->next = this;
    return temp;
}

int main()
{
    llist<int>* my_integer_list = nullptr;

    my_integer_list = my_integer_list->Add(42);

    my_integer_list = my_integer_list->Clear();

    return 0;
}

ただし、これは見苦しいコードになり、メモリ リークが発生しやすくなります。メソッドでこれを行うより良い方法があるはずですが、私は本当に何も考えられません。ポインター用のメソッドを作成しようとしましたが、C++ では違法です。私のような適切な OOP スタイルの取引クラスについて教えてもらえますか?

4

1 に答える 1

3

あなたが遭遇した問題は、あなたのllistクラスが実際にはリスト全体ではなく、リンクされたリスト内の単一のノードであるという事実に起因しているため、addメソッドを持つことは意味がありません. これは実際に非 OOP コードにも当てはまります。 関数はオブジェクトではなく、オブジェクトへの参照を持つオブジェクト (ここでは単なるポインター) に対してllistAdd作用します。これは、問題の解決策を示唆しています。古いクラスの名前を に変更し、リストの先頭であるa へのポインタを持つ新しいクラスを作成し、この新しいクラスでllistllistllistnodellistllistnode

template<typename T> class llistnode
{
  public:
    T data;
    llistnode<T>* next;

    llistnode() {next=nullptr;}
    llistnode(const T& d) {data=d;next=nullptr;}
};

template<typename T> class llist
{
  private:
    llistnode<T>* head;

  public:
    void Add(const T& d) {
        llistnode<T>* new_node = new llistnode<T>(d);
        new_node.next = head;
        head = new_node;
    }
};
于 2013-06-20T17:57:45.353 に答える