1

私は3つのクラスを持っています。1つは基本クラスで、他は基本クラスから継承されたクラスです。クラスのコードは次のとおりです。

// Event Class
#ifndef EVENT_H
#define EVENT_H

#include <iostream>

namespace Engine
{
    namespace Data
    {
        // base class
        class Event
        {
            public:
                // Class Variable
                int Measure;
                int Beat;
                int Position;

                // This Class that was I mean
                class SampleEvent;
                class TimeEvent;

                // Constructor
                Event(int measure, int beat, int pos);
        };

        // Sample Event Class (inherit to Event Class)
        class Event::SampleEvent : public Event
        {
            public:
            // variable in SampleEvent Class
            int ID;
            float Pan;
            float Vol;

            // Constructor
            SampleEvent(int id, float pan, float vol, int measure, int beat, int pos);
        };

        // Time Event Class (inherit to Event class)
        class Event::TimeEvent : public Event
        {
            public:
            // variable in TimeEvent Class
            double Value;

            // Constructor
            TimeEvent(double value, int measure, int beat, int pos);
        };

        // Constructor of Event
        Event::Event(int measure, int beat, int pos)
        {
            Measure         = measure;
            Beat            = beat;
            Position        = pos;
        }

        // Constructor of Sample Event
        Event::SampleEvent::SampleEvent(int id, float pan, float vol, int measure, int beat, int pos) : Event(measure, beat, pos)
        {
            ID                      = id;
            Pan                     = pan;
            Vol                     = vol;
            Measure         = measure;
            Beat            = beat;
            Position        = pos;
        }

        // Constructor of Time Event
        Event::TimeEvent::TimeEvent(double value, int measure, int beat, int pos) : Event(measure, beat, pos)
        {
            Value                   = value;
            Measure         = measure;
            Beat            = beat;
            Position        = pos;
        }
    }      
}
#endif

たとえば、2 つの変数がSEありTESESampleEvent と TimeEvent の TE の場合、それらをベクトルに挿入し、ベクトルから取得したいだけです。現在のコードは次のとおりです。

Event::SampleEvent SE = Event::SampleEvent(1000, 0, 0, 10, 10, 10);
Event::TimeEvent TE = Event::TimeEvent(200, 20, 20, 20);
vector<Event> DataEvent;

// insert Event
DataEvent.push_back(SE);
DataEvent.push_back(TE);

// Now I just want to get it back
Event::SampleEvent RSE = DataEvent[0]; // -> Error no suitable user-defined conversion from "Engine::Data::Event" to "Engine::Data::Event::SampleEvent" exists
Event::TimeEvent RTE = DataEvent[0];   // -> Error no suitable user-defined conversion from "Engine::Data::Event" to "Engine::Data::Event::TimeEvent" exists

// And I don't know how to detecting the inheritance Class
// something like if (RSE == Event::SampleEvent) or if (RTE == Event::TimeEvent) @_@
4

3 に答える 3

1

元に戻すにはキャストする必要があると思います。SampleEvent と TimeEvent を Event に暗黙的にキャストすることはできますが、その逆は暗黙的に行うことができないためです。

これをキャストで適切に機能させるには、イベントの参照またはイベントへのポインターを使用する必要があります。

参照の使用

*removed* you cannot make a vector reference.

ポインターの使用

Event::SampleEvent SE = Event::SampleEvent(1000, 0, 0, 10, 10, 10);
Event::TimeEvent TE = Event::TimeEvent(200, 20, 20, 20);

std::vector<Event*> DataEvent;
// insert Event
DataEvent.push_back(&SE);
DataEvent.push_back(&TE);
// get the events back, note this can throw an exception if you cast incorrectly.
Event::SampleEvent* RSE = (Event::SampleEvent*)DataEvent[0]; 
Event::TimeEvent* RTE = (Event::TimeEvent*)DataEvent[1]; 
/// This also Works using static_cast
//Event::SampleEvent* RSE = static_cast<Event::SampleEvent*>(DataEvent[0]); 
//Event::TimeEvent* RTE = static_cast<Event::TimeEvent*>(DataEvent[1]);  
std::cout << RSE->ID << std::endl;
std::cout << RTE->Value << std::endl;

出力は次のとおりです。1000 200

キャストの詳細については、このスタックオーバーフローの回答を参照してください。

于 2013-03-29T17:14:14.030 に答える
0

あなたはベクトルを持っています

vector<Event> DataEvent;

したがって、次のように使用する必要があります。

Event E = DataEvent[0];

入力した場合Event::SampleEvent RSE = DataEvent[0];、基本クラスのポインターでサブクラスを指す機能を使用していませんが、単にオブジェクトをキャストしています。このキャストを成功させたい場合は、変換演算子を提供するか、代わりにポインターのベクトルを使用することを検討する必要があります。vector<Event* > DataEvent;特定のイベントを取得したい場合dynamic_cast<>は、実際にこのサブクラスである場合にのみ、サブクラスのオブジェクトを動的に取得できるようにするために使用できますオブジェクト: 共通の基本クラスの下にあるベクトルに多くの異なるサブクラスを含めることができることを覚えておいてください。また、いくつかの仮想メソッドが必要ですdynamic_cast<>。追加するだけで十分です

virtual void f(){}

イベントクラスへ

于 2013-03-29T17:16:58.203 に答える
0

サブクラス オブジェクト自体を基本クラス オブジェクトにキャストすることはできませんが、サブクラス オブジェクトへの参照 (ポインターなど) を基本クラスの参照に簡単にキャストできます。

于 2013-03-29T17:20:16.837 に答える