Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > (boost:function) Определить указатель на [new]


Автор: featZima 12.9.2010, 23:35
Подскажите как определить указатель на функцию конструктор... Что-нибудь вроде такого:

Код

boost::function<someClass* ()> constructorToSomeClass;
constructorToSomeClass = operator new someClass();


p.s. хотелось бы получить указатель на функцию-конструктор данных объектов, то есть чтобы можно было потом делать так:

Код

someClass* some = constructorToSomeClass();

Автор: boostcoder 12.9.2010, 23:38
поясни...
тебе нужен объект boost::function возвращающий указатель? или указатель на объект boost::function возвращающий указатель?

Автор: bsa 13.9.2010, 00:01
featZima, конструктор не создает объекты, он их инициализирует. Создает же оператор new (или автоматически в стеке). Поэтому тебе нужно сделать функцию, которая бы создавала объекты с помощью new. Кстати, я бы рекомендовал в этом случае еще использовать boost::shared_ptr... Чтобы хлопот было меньше.

Автор: featZima 13.9.2010, 00:28
Вариант с дополнительной функцией вполне работает, но хотелось бы покороче )
Код

class SomeClass
{
public:
    SomeClass() {};
    ~SomeClass() {};
};

SomeClass* constructorToSomeClass()
{
    return new SomeClass();
}

int main(int argc, char** argv) {
    boost::function<void* ()> func1;

    func1 = constructorToSomeClass;

    SomeClass* someClass = func1();

    return 0;
}


Автор: Earnest 13.9.2010, 06:39
Цитата(featZima @  13.9.2010,  00:35 Найти цитируемый пост)
p.s. хотелось бы получить указатель на функцию-конструктор данных объектов, то есть чтобы можно было потом делать так:

На конструктор нельзя получить указатель. Существует понятие "виртуальный конструктор", так это примерно то, что ты нарисовал, т.е. некоторая функция, которая умеет создавать и инициализировать объекты заданного класса\иерархии.
Вместо бустовых оберток можно использовать "обычные" указатели на функции (это ведь чаще всего глобальная функция или статическая). Это слегка быстрее, но все зависит от задачи. Если нужна универсальность сигнатур, то через буст (т.к. в function можно и метод класса, и статическую функцию с параметрами и прочая запихнуть). А если универсальность не нужна - обычный указатель сойдет. Но в любом случае отдельная функция нужна. Если сильно влом писать три строчки кода на класс, то можно соорудить макрос или шаблон.

Автор: icecrashldr 13.9.2010, 11:27
"виртуальный конструктор" -> называет "именованный конструктор", либо же строитель(фабрика).


featZima, НА что именно вы хотите получить указатель? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)