2012-04-09 3 views
1

У меня есть тест на следующей неделе для C++, и я готовлюсь к этому. Я смущен, когда у меня есть 2 класса, как показано ниже. Мне нужно пройти через выполнение кода, по очереди, и я запутался в отмеченных строках (x = ... и y = ... внутри class two) - где же исполнение идет оттуда?Вызов конструктора класса внутри другого класса

#include <iostream> 
using namespace std; 

class one { 
    int n; 
    int m; 
    public: 
    one() { n = 5; m = 6; cout << "one one made\n"; } 
    one(int a, int b) { 
     n = a; 
     m = b; 
     cout << "made one one\n"; 
    } 
    friend ostream &operator<<(ostream &, one); 
}; 

ostream &operator<<(ostream &os, one a) { 
    return os << a.n << '/' << a.m << '=' << 
     (a.n/a.m) << '\n'; 
} 

class two { 
    one x; 
    one y; 
    public: 
    two() { cout << "one two made\n"; } 
    two(int a, int b, int c, int d) { 
     x = one(a, b); //here is my problem 
     y = one(c, d); //here is my problem 
     cout << "made one two\n"; 
    } 
    friend ostream &operator<<(ostream &, two); 
}; 

ostream &operator<<(ostream &os, two a) { 
    return os << a.x << a.y; 
} 

int main() { 
    two t1, t2(4, 2, 8, 3); 
    cout << t1 << t2; 
    one t3(5, 10), t4; 
    cout << t3 << t4; 
    return 0; 
} 
+3

В чем проблема? Что ты пытаешься сделать? – Cascabel

+0

, когда я получаю x = один (a, b); Я не знаю, куда идти после этого. – Jack

+0

Что значит «когда я добираюсь» и «куда идти»? Вы пытаетесь отслеживать выполнение программы по строкам? – Cascabel

ответ

3
x = one(a, b); //here is my problem 
y = one(c, d); //here is my problem 

Что делает этот код является то, что он вызывает конструктор класса one и присваивает вновь созданный экземпляр этого класса переменных x и y.

Конструктор класса one в строке 9.

+0

ОК. поэтому какое значение будут иметь x и y? – Jack

+0

Это зависит от того, какие значения вы дадите конструктору 'two'. После выполнения вашего основного класса у вас будет (для 't2')' x = one (4,2) 'и' y = one (8,3) '. Обратите внимание, что вы не будете создавать 'x' и' y' для 't1', потому что он использует другой соответствующий конструктор. – Radix

+0

@ahmadhussain 'x.n' будет иметь значение' a', 'x.m' будет иметь значение' b', 'y.n' будет иметь значение' c', а 'y.m' будет иметь значение' d'. – FlyingFoX

3

от линии x = one(a, b); прыгает на линию one(int a, int b) и выполняет параметризованный конструктор one

же для линии y = one(c, d);

1

Current подход работает, только если у вас есть конструктор по умолчанию в одном классе. Лучше инициализировать элементы в списке инициализаций конструктора:

two(int a, int b, int c, int d) 
    : x(a,b), y(c,d) 
{ 
     cout << "made one two\n"; 
} 
Смежные вопросы