2014-03-07 5 views
0

Не знаю, насколько странным этот вопрос может быть для вас: почему этот код печатает 6 вместо 5? насколько я знаю, следует использовать обычную арифметику здесь, так как когда-то я не перегрузил + оператора и 2+3 = 3+2 = 5 (насколько я знаю)Почему этот код печатает 6 вместо 5?

#include <stdio.h> 
#include <stdlib.h> 

enum A 
{ 
    A_A, 
    A_B 
}; 

struct Foo 
{ 
    Foo(int, int, enum A); 
    int x; 
    int y; 
    enum A flags; 
}; 

struct Baa : Foo 
{ 
    Baa(int, int); 
    void show(); 
}; 


Foo::Foo(int a, int b, enum A aflags) 
{ 
    x = a; 
    y = b; 
    flags = aflags; 
} 

Baa::Baa(int c, int d) 
    : Foo(c, d, A_B) 
{ 
} 

void Baa::show() 
{ 
    if(flags == A_A) 
     printf("a = [%d]\n", x + y); 
    else if(flags == A_B) 
     printf("b = [%d]\n", y + y); 
    else 
     puts("unknow flag"); 
} 

int main() 
{ 
    Baa *b = new Baa(2, 3); 
    b->show(); 
} 

выход:

b = [6] 

У меня была другая проблема доступ к значению члена производного класса - если вы хотите знать, я получал 0 вместо фактического значения, поэтому, чтобы получить фактическое значение, которое мне нужно было передать этому типу производного класса, например int x = ((BaseCLass*)this)->n, он работал. Поэтому я начал писать короткую версию своего кода, чтобы публиковать здесь информацию о ОС и просить о помощи, но теперь я нашел эту проблему. Что мне не хватает?

+1

Конструктор Baa() обращается к конструктору Foo() с установленным флагом A_B. Вам не кажется? Поэтому он добавляет y + y; – user3329166

ответ

4
printf("b = [%d]\n", y + y); 

Не значит быть x+y вместо y+y? Итак, 3 + 3 равно 6, что верно.

+0

Вот что имеет код для случая, когда 'flags == A_A'. Так что, возможно, дизайн выключен. –

+1

О, Боже, мне нужно спать. Я не верю, что я пришел к SO, чтобы спросить об этом. :( –

+1

@ TheMask Не беспокойтесь, это случается. Сделайте перерыв. – Mahesh

1

Мне кажется, что ключ линия:

else if(flags == A_B) 
    printf("b = [%d]\n", y + y); 

Baa конструктор устанавливает flags к A_B. Так show() Выведет y + y, то есть 3 + 3 = 6.

3

вы создаете Baa объект с:

Baa *b = new Baa(2, 3); 

, что произойдет дальше,:

Baa::Baa(int c, int d) 
    : Foo(c, d, A_B) // < flag A_B ! 
{ 
} 

и что она делает это :

Foo::Foo(int a, int b, enum A aflags) 
{ 
    x = a; 
    y = b; 
    flags = aflags; 
} 

затем в show метод вы делаете:

else if(flags == A_B) 
     printf("b = [%d]\n", y + y); 

И y + y = 3 + 3 = 6. Где замешательство?


сторона примечание: где delete b;?

Смежные вопросы