Не работает оператор приведения типа
От: Аноним  
Дата: 25.10.05 07:52
Оценка:
Народ подскажите пожалуйста почему не работает оператор приведения типа в такой конструкции
(visual studio 2003)


class A
{
public:
 int a;
 A():a(0){};
 A& operator=(const A copy)
 {
     a=copy.a;
     return *this;
 }
};


class B:public A
{
public:
    int b; 
    B():b(0)
    {}
    operator A()
    {
        A A1;
        A1.a=b-1;
        return A1; 
    }
    B& operator=(const B copy)
    {
        b=copy.b;
        a=copy.a;
        return *this;
    }
};


class C:public B
{
public :
    int c;
    C():
    c(0)
    {
    }
    operator B()
    {
        B B1;
        B1.b=c-1;
        return B1; 
    }
    C& operator=(const C copy)
    {
        c=copy.c;
        b=copy.b;
        a=copy.a;
        return *this;
    }
};

int main(void)
{
    C c;
    c.c=5;
    std::cout<<((B)c).b;//Здесь хотелось бы чтобы вывелось 4
   return 0;
}
Re: Не работает оператор приведения типа
От: crable США  
Дата: 25.10.05 07:57
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Народ подскажите пожалуйста почему не работает оператор приведения типа в такой конструкции

А>(visual studio 2003)


А>
А>class A
А>{
А>public:
А> int a;
А> A():a(0){};
А> A& operator=(const A copy)
А> {
А>     a=copy.a;
А>     return *this;
А> }
А>};


А>class B:public A
А>{
А>public:
А>    int b; 
А>    B():b(0)
А>    {}
А>    operator A()
А>    {
А>        A A1;
А>        A1.a=b-1;
А>        return A1; 
А>    }
А>    B& operator=(const B copy)
А>    {
А>        b=copy.b;
А>        a=copy.a;
А>        return *this;
А>    }
А>};


А>class C:public B
А>{
А>public :
А>    int c;
А>    C():
А>    c(0)
А>    {
А>    }
А>    operator B()
А>    {
А>        B B1;
А>        B1.b=c-1;
А>        return B1; 
А>    }
А>    C& operator=(const C copy)
А>    {
А>        c=copy.c;
А>        b=copy.b;
А>        a=copy.a;
А>        return *this;
А>    }
А>};

А>int main(void)
А>{
А>    C c;
А>    c.c=5;
А>    std::cout<<((B)c).b;//Здесь хотелось бы чтобы вывелось 4
А>   return 0;
А>}
А>


12.3.2/1

A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.

The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[2]: Не работает оператор приведения типа
От: crable США  
Дата: 25.10.05 08:08
Оценка:
Здравствуйте, crable, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


А>>Народ подскажите пожалуйста почему не работает оператор приведения типа в такой конструкции

А>>(visual studio 2003)


А>>
А>>class A
А>>{
А>>public:
А>> int a;
А>> A():a(0){};
А>> A& operator=(const A copy)
А>> {
А>>     a=copy.a;
А>>     return *this;
А>> }
А>>};


А>>class B:public A
А>>{
А>>public:
А>>    int b; 
А>>    B():b(0)
А>>    {}
А>>    operator A()
А>>    {
А>>        A A1;
А>>        A1.a=b-1;
А>>        return A1; 
А>>    }
А>>    B& operator=(const B copy)
А>>    {
А>>        b=copy.b;
А>>        a=copy.a;
А>>        return *this;
А>>    }
А>>};


А>>class C:public B
А>>{
А>>public :
А>>    int c;
А>>    C():
А>>    c(0)
А>>    {
А>>    }
А>>    operator B()
А>>    {
А>>        B B1;
А>>        B1.b=c-1;
А>>        return B1; 
А>>    }
А>>    C& operator=(const C copy)
А>>    {
А>>        c=copy.c;
А>>        b=copy.b;
А>>        a=copy.a;
А>>        return *this;
А>>    }
А>>};

А>>int main(void)
А>>{
А>>    C c;
А>>    c.c=5;
А>>    std::cout<<((B)c).b;//Здесь хотелось бы чтобы вывелось 4
А>>   return 0;
А>>}
А>>


C>12.3.2/1

C>

C>A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.


Проще говоря, в стандарт языка C++ говорится о том, что оператор приведения типа к базовому классу не будет вызван.

Кстати, конструктор копии должен принимать ссылку на объект (иначе как по-твоему в него будет передаваться аргумент?).
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Не работает оператор приведения типа
От: GregZ СССР  
Дата: 25.10.05 08:15
Оценка: 23 (1)
Здравствуйте, Аноним, Вы писали:

А>Народ подскажите пожалуйста почему не работает оператор приведения типа в такой конструкции

А>(visual studio 2003)

Оператор приведения типа к одному из базовых классов не может быть вызван неявно.
Только явно:

int main(void)
{
    C c;
    c.c=5;
    std::cout<<c.operator B().b;//Здесь хотелось бы чтобы вывелось 4
   return 0;
}
Re[3]: Не работает оператор приведения типа
От: MaximE Великобритания  
Дата: 25.10.05 08:25
Оценка: +1
On Tue, 25 Oct 2005 12:08:43 +0400, crable <45397@users.rsdn.ru> wrote:

[]

> Кстати, конструктор копии должен принимать ссылку на объект (иначе как по-твоему в него будет передаваться аргумент?).


Здесь все в порядке, т.к. конструктор копий генерится компилятором.

Определенный же здесь оператор присваивания принимает объект по значению. В этом случае параметр copy initialized при помощи конструктора копий.

8.5 Initializers
...
12 The initialization that occurs in argument passing, function return, throwing an exception (15.1), handling an exception (15.3), and brace-enclosed initializer lists (8.5.1) is called copy-initialization and is equivalent to the form

T x = a;

...
14 ... If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version of the source type is the same class as, or a derived class of, the class of the destination, constructors are considered. The applicable constructors are enumerated (13.3.1.3), and the best one is chosen through overload resolution (13.3). The constructor so selected is called to initialize the object, with the initializer expression(s) as its argument(s). If no constructor applies, or the overload resolution is ambiguous, the initialization is ill-formed.


12.8 Copying class objects
...
9 A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatile X&.


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0 beta
Re[4]: Не работает оператор приведения типа
От: crable США  
Дата: 25.10.05 08:29
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Tue, 25 Oct 2005 12:08:43 +0400, crable <45397@users.rsdn.ru> wrote:


ME>[]


>> Кстати, конструктор копии должен принимать ссылку на объект (иначе как по-твоему в него будет передаваться аргумент?).


ME>Здесь все в порядке, т.к. конструктор копий генерится компилятором.


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

[snip]

ME>--

ME>Maxim Yegorushkin
The last good thing written in C was Franz Schubert's Symphony No. 9.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.