Преобразование типов, вопрос.
От: Aractan  
Дата: 12.07.06 05:22
Оценка:
Ситуация:

struct A
{
......
};

struct B: public A
{
};

A a1;
B b1;

// надо сделать b1::A = a1
// я делаю так
*static_cast<A*>(&b1) = a1;


ИМХО громоздко, как можно по-другому?
Re: Преобразование типов, вопрос.
От: Bell Россия  
Дата: 12.07.06 05:45
Оценка: 1 (1)
Здравствуйте, Aractan, Вы писали:

A>Ситуация:


A>
A>struct A
A>{
A>......
A>};

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

A>A a1;
A>B b1;

A>// надо сделать b1::A = a1
A>// я делаю так
A>*static_cast<A*>(&b1) = a1;

A>


A>ИМХО громоздко, как можно по-другому?


static_cast<A&>(b1) = a1;


Реализовать в B оператор присваивания для A.
Любите книгу — источник знаний (с) М.Горький
Re: Преобразование типов, вопрос.
От: Кодт Россия  
Дата: 12.07.06 07:53
Оценка: 7 (4)
Здравствуйте, Aractan, Вы писали:

Поскольку в каждом классе (неявно) определён оператор присваивания, то происходит сокрытие имён.
struct A
{
  A& assign(const A&);
  //A& operator=(const A&); // определён компилятором
};

struct B : A
{
  B& assign(const B&); // скрывает сигнатуры assign предка
  //B& operator=(const B&); // скрывает сигнатуры operator= предка
};

int main()
{
  A a;
  B b;

  b.assign(a); // ошибка: единственная доступная сигнатура принимает const B&
  b = a; // та же самая история
}

Выходов два: или определить нужные сигнатуры, или протащить их из предка
struct B : A
{
  using A::assign;
  using A::operator=;
  
  B& assign(const B&);
};

int main()
{
  A a;
  B b, c;

  b.assign(a); // метод предка
  b.assign(c); // родной метод
  
  b = a; // метод предка
  b = c; // родной метод
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[2]: Преобразование типов, вопрос.
От: Aractan  
Дата: 12.07.06 08:03
Оценка:
B>
B>static_cast<A&>(b1) = a1;
B>


Угу, точно, я не додумался до этого
Re[2]: Преобразование типов, вопрос.
От: Aractan  
Дата: 12.07.06 08:05
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>[/c]

К>Выходов два: или определить нужные сигнатуры, или протащить их из предка
К>
К>struct B : A
К>{
К>  using A::assign;
К>  using A::operator=;
  
К>  B& assign(const B&);
К>};

К>


Вау, я про то что assign автоматически генерируется вообще не знал,
и то, что методы можно протаскивать тоже. Спасибо!
Re[3]: Преобразование типов, вопрос.
От: Кодт Россия  
Дата: 12.07.06 08:32
Оценка:
Здравствуйте, Aractan, Вы писали:

A>Вау, я про то что assign автоматически генерируется вообще не знал,

assign как раз не генерируется автоматически. Я написал его рядом с operator= для контраста, чтобы показать: неважно, рукодельный метод или автоматический, эффект один и тот же.

A>и то, что методы можно протаскивать тоже. Спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[3]: Преобразование типов, вопрос.
От: Кодт Россия  
Дата: 12.07.06 08:32
Оценка:
Здравствуйте, Aractan, Вы писали:

A>Угу, точно, я не додумался до этого


Кстати, а как дела обстоят с осмысленностью?
Например,
struct A { int x; };
struct B : A { int y; using A::operator=; };

int main()
{
  A a = { 1 };
  B b = { 2, 3 };
  b = a; // { 1, 3 } - т.е. в b.y остались старые данные, возможно не согласованные с новыми
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[4]: Преобразование типов, вопрос.
От: Aractan  
Дата: 12.07.06 09:12
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Кстати, а как дела обстоят с осмысленностью?


тут у меня все нормально, все под контролем
Re: Преобразование типов, вопрос.
От: Павел Кузнецов  
Дата: 13.07.06 03:52
Оценка: 1 (1)
Aractan,

>
> // надо сделать b1::A = a1
> // я делаю так
> *static_cast<A*>(&b1) = a1;
>

> ИМХО громоздко, как можно по-другому?

Например, так:
b1.A::operator =(a1);
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.