Как реализовать?
От: amberovsky  
Дата: 07.02.08 13:10
Оценка:
Hi, All.

Помогите плиз с реализацией.
class A { };
class B : public A { };

void main_main(A *) {} ;
void call_main() { main_main(get()); };

class C;

C get ()
{
/*
Здесь нужно вернуть объект класса B. (legacy)
Проблема в том, что глобально создавать переменные нельзя.
new/delete не подходит.

Я в качестве класса C выбрал boost::shared_ptr<B>, но shared_ptr не умеет неявно кастоваться к базовому классу,
что нужно по legacy.

Как копать?
*/
}

Добавлена разметка — Кодт
Re: Как реализовать?
От: Stormblast http://www.myspace.com/stormblastblack
Дата: 08.02.08 08:09
Оценка:
Здравствуйте, amberovsky, Вы писали:

А что нужно сделать фабрику ?
Re[2]: Как реализовать?
От: amberovsky  
Дата: 08.02.08 16:10
Оценка:
Здравствуйте, Stormblast, Вы писали:

S>Здравствуйте, amberovsky, Вы писали:

S>А что нужно сделать фабрику ?

Нет.. нужно вернуть объект, который умеет неявно кастоваться в класс А и В.
Который не уничтожится сразу после выхода из функции.
Без глобальных переменных.
Re: Как реализовать?
От: AntiFreeze  
Дата: 11.02.08 07:54
Оценка:
Здравствуйте, amberovsky, Вы писали:

A>Hi, All.


A>Помогите плиз с реализацией.

A>
A>class A { };
A>class B : public A { };

A>void main_main(A *) {} ;
A>void call_main() { main_main(get()); };

A>class C;

A>C get ()
A>{
A>/*
A>Здесь нужно вернуть объект класса B. (legacy)
A>Проблема в том, что глобально создавать переменные нельзя.
A>new/delete не подходит.

A>Я в качестве класса C выбрал boost::shared_ptr<B>, но shared_ptr не умеет неявно кастоваться к базовому классу,
A>что нужно по legacy.

A>Как копать?
A>*/
A>}
A>


А почему get() должен обязательно возвращать некий объект, а не простой указатель?
Re[3]: Как реализовать?
От: De Bug Финляндия  
Дата: 11.02.08 09:11
Оценка:
A>Нет.. нужно вернуть объект, который умеет неявно кастоваться в класс А и В.
отвечать за невозможность выбора перегруженной функции (x(A*)|x(B*)) будет автор требования

A>Который не уничтожится сразу после выхода из функции. Без глобальных переменных.

Может так?

class A { };
class B : public A { };

void main_main(A *) {} ;
void call_main() { main_main(get()); };

class C
{
  A a;
  B b;
public:
  operator A* () { return &a; }
  operator B* () { return &b; }
};

C get () // лучше было бы вернуть по ссылке
{
  static C c;
  return c;
}


ЗЫ Мне кажется что так делать не стоит, нужно вернуться в проектировании на шаг назад и понять что вызывало такие требования.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.