3

混合リストを実装しようとしているので、たとえば次のことができます。

mylist* l= new mylist();
l.push_back<int> (4);
l.push_back<string> ("hello");

これは演習であるため、boost などの他のライブラリを使用するための有効なソリューションではありません。これはまだメソッドが少ないクラスです:

template <class T>
class node
{
private:

    void* next;
    void* prev;
    T data;

public:

    node(T data)
    {
        this->data=data;
    }

    template <class R>
    void link_to (node<R>& other)
    {
        next=&other;
        other.prev=this;
    }

};

void ポインターを使用するという事実を管理する方法がわからないため、それが指すデータを実際のクラスにキャストすることはできません。dynamic_cast を使用すると、すべてのタイプ (ノード、ノードなど) を試す必要があるため、許容できる解決策。たとえば、一連のノードを印刷したい場合、それはできません。

int main(int argc, char** argv)
{
// for this example let's suppose that node fields were public
    node<int> a(1),c(2);
    node<std::string> b; 
    a.linkTo(b);
    b.linkTo(c);
    std::cout << a.data;  // this is ok but I need to print also other nodes
// let's suppose that b and c were unreachable and that I want to reach them
// by iterating into the list
    void* ptr=a.next; //public field
    cout << ptr->data; //can't do that in C++
}

全体の問題は、反復するすべての要素のタイプがわからないことです。次はノードまたはノードまたはノードなどです...しかし、この問題を解決するにはどうすればよいですか? すべてのノードのタイプを知ることはできますが、できません。混合リストを実装する方法は?

4

1 に答える 1

2

保存しているオブジェクトの種類がわからないので、割り当てられたオブジェクトのコピーへのvoidポインタを保存するのが最も簡単な方法だと思います。

次に、オブジェクトと一緒にある種のタイプタグを保存する必要があります。type_infoによって返されるオブジェクトのアドレスを使用できる可能性がありますtypeid

解決方法がわからない他の問題がいくつかあります。リストを破棄するには、要素ごとにデストラクタが必要です。おそらく、タイプがわかっている場合は、要素の作成中にデストラクタのアドレスを保存できます。

于 2012-04-19T23:57:01.483 に答える