3

私は次のクラスを持っています:

typedef struct Listable
{
    struct Listable *next;
    struct Listable *prev;

    // Lots of other class members not pertaining to the question excluded here
} Listable;

そして私はそれから次のように継承します:

typedef struct Object : Listable
{
} Object;

問題は、私がこのようなことをするときです:

Object *node;
for (node = objectHead; node; node = node->next);

node は Object 型ですが、node->next は Listable 型であるため、「node = node->next」でエラーが発生します。

Listable 基本クラスでテンプレートを使用して、前と次のポインターの型を使用中のクラスに変更するにはどうすればよいですか?

おそらく次のようなものです:

typedef struct Listable<T>
{
    struct Listable<T> *next;
    struct Listable<T> *prev;

    // Lots of other class members not pertaining to the question excluded here
} Listable;

そして私はそれから次のように継承します:

typedef struct Object : Listable<Object>
{
} Object;

私は 10 年以上 C を使用していますが、テンプレートなどの C++ 機能についてはまったくの初心者です。したがって、どの構文を使用すればよいかわかりません。

4

3 に答える 3

3

テンプレートの構文自体はかなり単純です。

template <typename T>
struct Listable
{
    T *next;
    T *prev;

    // Lots of other class members not pertaining to the question excluded here
};

したがって、次のように継承されるObjectと:

struct Object : Listable<Object>
{
};

Objectnextprevポインタを取得します。

はポインターを管理しているため、3 つのルールにListable注意する必要があります。つまり、メモリが適切に管理されるように、破棄、コピーの構築、および割り当て中に何をする必要があるかを考える必要があります。

于 2013-08-06T01:54:37.013 に答える
1

単に使用したくないですか:

Listable *node;
for (node = objectHead; node; node = node->next);

代わりは?Object は Listable を継承しているため、node が実際には Object であっても機能します。

また、Jerry が言及しているように、C++ 標準テンプレート ライブラリの一部である組み込みのテンプレート化された双方向リンク リストが既に存在します。std::foreach を使用して操作することもできるため、 for ループを手動で記述する必要もありません。

#include <list>
#include <algorithm>
#include <iostream>

struct Sum {
    Sum() { sum = 0; }
    void operator()(int n) { sum += n; }

    int sum;
};

int main()
{
    std::list<int> nums{3, 4, 2, 9, 15, 267};

    Sum s = std::for_each(nums.begin(), nums.end(), Sum());

    std::cout << "sum: " << s.sum << '\n';
    std::cout << "elements:  ";

    //Or, you could use iterate over each node in the list like this
    for (auto n : nums) {
        std::cout << n << " ";
    }
    std::cout << '\n';
}
于 2013-08-06T02:33:32.727 に答える
0

リンクされたリストの概念とリンクされたリスト内のノードの概念を混同しているようです。次にObject、(おそらく)これらの混乱したノード/リンクリストのものの1つであるを追加しています。少なくとも私には、これは非常に混乱しているように聞こえます。

私は次のようなものを見たいと思います:

template <class T>
class linked_list { 
    class node {
        T data;
        node *next;
    public:
        node(T data, node *next = NULL) : data(data), next(next) {}    
    };

    node *head;
public:
    void push_back(T const &item);
    void push_font(T const &item);
    // etc.
};

警告: もちろん、実際のコードでは、1) リンク リストをまったく使用したくないでしょうし、2) 使用したとしても、おそらくstd::list.

于 2013-08-06T02:25:53.493 に答える