LINUX.ORG.RU

C++


0

0

Ребята! Может кто поможет вот в таком вопросе!
Нужно на С++ создать объект по имени класса! Я С++ начал изучать недавно, так что не ругайте если глупость спросил. :) Всем заранее спасибо!
anonymous

class MyClass{
public:
...
};

MyClass myclass;

anonymous
()

Спасибо за ответ!!! :) Но я имел ввиду немного другое! Моя ошибка - не пояснил...

Например в конф файле у меня имена классов, мне надо прочитав этот файл, создать экземпляры. 
Все эти классы наследники одного подкласса... Вот такая задачка...

class AbstractClass {
};

class MyClass1: public AbstractClass {
};

class MyClass2: public AbstractClass {
};

Мне надо прочитав конфиг, создать к примеру 2 экземпляра MyClass1 и 3 MyClass2...

Хранить их можно например в std::vector

anonymous
()
Ответ на: комментарий от anonymous

Так ведь это ... Use RTTI, Luke

Впрочем эта RTTI такая гадость, что проще сделать без него. Читай книги по реализации COM-а под виндой 

anonymous
()

Рефлексии захотелось? В статически компилируемом языке, с минимальным RTTI? Чувак, ты или глуп, или не тот язык для своей задачи выбрал.

anonymous
()
Ответ на: комментарий от anonymous

Не слушай этих анонимусов!

Решить поставленную задачу можно при помощи фабрики объектов.
Почитай книгу Андрея Александреску "Современное проектирование на C++"
Там описывается шаблон AbstractFactory и многое другое!

Почитай также "Design Patterns" by Gang of four

Krivenok_Dmitry
()
Ответ на: комментарий от Krivenok_Dmitry

В анал Александреску. Юзать Java - и не пукать!

oops
()
Ответ на: комментарий от anonymous

А в чем собственно проблема?
std::vector<AbstractClass*> objs;
while(!istr.eof())
{
 std::string buf; istr >> buf;
 if(buf == "MyClass1") objs.push_back(new MyClass1);
 else if(buf == "MyClass2") objs.push_back(new MyClass2);
}

Или я что-то не-допонял?

Flogger_d
()
Ответ на: комментарий от oops

class MyClass1: public AbstractClass {
};

class MyClass2: public AbstractClass {
};


А это что - не имена чтоли?

Flogger_d
()
Ответ на: комментарий от Flogger_d

На препроцессоре это будет смотреться куда лучше

anonymous
()
Ответ на: комментарий от KIV

Тебе ж русским языком сказали - рефлексии он хочет.

anonymous
()

"Проект живёт довольно долго" и "только начал учить C++" - не очень совместимы. Так что обломись покрепче.

Вот тебе:

Class myClass = Class.forName(строка-из-конфига);

Object ob = myClass.newInstance();

И всё. Просто, быстро, красиво.

anonymous
()
Ответ на: комментарий от anonymous

>"Проект живёт довольно долго" и "только начал учить C++" не очень совместимы.

Легко. Программисты приходят и уходят, а проект должен жить, Сам обломись.

>class myClass = Class.forName(строка-из-конфига);
>Object ob = myClass.newInstance();

Ну да, прикольно. Только именно с этого и надо было начинать.

Flogger_d
()
Ответ на: комментарий от anonymous

есть такое понятие "порождающая функция". Она должна вызываться при парсинге конфига и делать тот класс который нуно. Ее придется писать руками, задавая какой класс надо делать в зависимости от аргумента, никуда не денешься... при этом моно извращаться в разной степени, экокномя строчки кода при помощи препроцессора или ище как, и соотвественно вывертывая мозги себе что бы это придумать и тем кто будет код поддерживать/испольщовать что бы придуманное понять....

Но с-но средств и приемов языка. что бы так вот динамически в зависмости от конфига сделать класс нету... единственное что могу предложить - причесывать конфиг до уровня с++ файла, компиялть из него so -шку и динамически ее линковать - ежели очень хочеться чтоб все "само" было. Реализация этого дела займет раз в дцать больше времени чем просто слабать руками;-)

AIv ★★★★★
()
Ответ на: комментарий от AIv

Спасибо всем кто ответил!!! Действительно, прямого варианта в С++ похоже нету... Ну да ладно, сделал чтоб всё ручками. В принципе нормально получилось...

anonymous
()
Ответ на: комментарий от anonymous

В Ада-2005 обещают прямой вариант!! Ada4ever =)

AiLr ★★
()
Ответ на: комментарий от anonymous

#include <map>
#include <string>

class AbstractFactory{
public:
// ...
 Object * createObject();
 static AbstractFactory * getFactoryByName(const std::string & name){
   // bla bla нашел в _factories и вернул
 }
protected:
static std::map<std::string, AbstractFactory *> _factories;
};
// Singletone
class MyClassFactory : public AbstractClass{
private:
 MyClass(){
// syncronize
  _factories.push_back(std::pair<std::string, AbstractFactory *>("MyClass",this));
// ugu
 static MyClassFactory _myClassFactory = null;
public:
 static AbstractFactory * createFactory(){
   if(MyClassFactory::_myClassFactory == null){
    _myClassFactory = new MyClassFactory();
   }
   return _myClassFactory;
 }; 
}
};
class MyClassRegistrator{
public:
 MyClassRegistrator(){
   MyClassFactory::createFactory();
 }
}
static MyClassRegistrator _myClassRegistrator;

eXOR ★★★★★
()
Ответ на: комментарий от eXOR

кароче думаю идея в целом понятной должна быть ;).

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.