It depends on what you are trying to do.
1) Are these skills 'attacks' that are used at specific times (based on user input) and then are finished or are they passive things (you gain them, and then you get, e.g. an experience bonus whenever you kill something)?
2) Is your game a turn-based RPG (like Pokemon, Dragon Quest, etc.) or a real time one (think Zelda, perhaps the Tales of ____ games (I don't really remember the combat in them though))?
Attacks + Real time
--you will need something like a timeline, as the attacks will have to move in certain ways and initiate their effects at certain times
Attacks + Turn based
--you can probably do you system the same way you do items -- skill have float damage, chanceOfHitting, chanceOfStatusCondition; int numberOfHits; enum STATUS_CONDITION; enum TYPE; float sp/mp/mana/___Cost;
Passive + Real time
--you probably just need an Object or Component, not a LogicComponent, as most of them will probably just respond to specific events (E_ENEMY_KILLED, etc.) and not to the general Update, FixedUpdate, etc. events
Passive + Turn based
--these can probably be realized as 2 functions -- an applySkill(Character) that adjusts current stats and such and a removeSkill(Character) that un-does that change, but that is up to you.
My game falls in to the Attacks+Real time, hence the timeline, but I also have abilities that fall into passive+real time, for which I use a script object (so basically a logic component).
If you need a container just to store which skill you have, just use a Vector<String> or Vector<StringHash> to store the name(hash) of the class and instantiate from the context as needed. You'll just have to register each as a factory (context_->RegisterFactory<Attack>();//replace Attack with each of your skill classes in turn). If you need a pointer to the objects of each class, use a Vector<LogicComponent*> to store them (you should probably use WeakPtrs or SharedPtrs though).
If you provide more details, I can try to give more specific feedback.