2009-10-04 2 views
0
class object_1 
{ 
    public: 
    ... 

    friend ofstream& operator<<(ofstream &out, const object_1 &obj_1); 
    friend object_2; 

    private: 

    char *pCh_mem1; 
    char *pCh_mem2; 
    int *pInt_mem1; 
    int *pInt_mem2; 
}; 


class object_2 
{ 
public: 
... 
friend ofstream& operator<<(ofstream &out, const object_2 &obj_2); 
friend object_1; 
}; 

Файл реализации Object1 типичен. Стор, Дтор и некоторые методы. Я havent разместил объявления метода в заголовке, потому что они не имеют отношения к моей проблеме.Перегрузка объектов и операторов C++

Очень важно, чтобы я обсуждал продолжительность жизни объектов. Это то, что мне действительно нужно понять. Случается, что функция перегрузки оператора затем вызывается, когда я вызываю object_2 в main. Таким образом, то оператор-функция перегрузки называется:

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

здесь мы:

void object_1::display(std::ostream &out) 
{ 
out << left << setw(28) << "Person" << setw(20) << "Place" ; 
out << right << setw(5) << "Thing" << setw(5) << "Idea" << endl; 

out << left << setw(28) << "----" << setw(20) << "--------" ; 
out << right << setw(5) << "----- " << setw(5) << "------" << endl; 
} 

В верхней части файла реализации является библиотека IOMANIP. Так что setw (X) и все определены. Я получаю 0 всех, прикованных к консоли. Мой объект вышел из сферы действия? Я так думаю, потому что, когда я делаю все это до того, как мне это нужно, он работает нормально. То есть, когда я называю эту функцию n e, где иначе, чем в теле оператора, она перегружается. Я думаю, потому что объект повторно объявлен:

ostream& operator<<(ostream& out, const object_2& obj_2); 

затем после того как я напечатать метод форматирования Мне нужно напечатать информацию, которая была передана в от основных до CTOR первого объекта; object_1. Когда это происходит, мы находимся в функции перегрузки, которая аналогична и имеет тот же файл реализации. Им оба метода вызова от перегрузки во второй функции объекты перегрузки:

ostream& operator<<(ostream& out, const object_1& obj_1) 
{ 
out << obj_1.pCh_mem1 << obj_1.pCh_mem2; 
return out; 
} 

// Главный object_2 obj_2 (4);

static void method1() 
{ 
//do stuff 
} 
static void method2() 
{ 
    //do stuff 
} 
static void method3() 
{ 
    //do stuff 
} 
int main(void) 
{ 
    method1(); 
    method2(); 
    method3(); 
    cout << obj_2; 
    return 0; // and such 
} 

После objc_2 называется как у см выше, перегрузка оператора для класса Объект2 будет тогда называться. Я не могу использовать никого из моих личных членов, потому что это незаконная операция. Наверное, мои вопросы. Как я могу напечатать своих частных членов из объекта1 в функции перегрузки оператора object2? static_cast-х? У меня есть случайный фрагмент из основного, его сложный и я не могу его изменить.

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

То, что я пытаюсь сделать, как вы видите выше, вызывает методы других объектов и получает информацию от их. Но эта информация - все NULL !! Im прыгает от одного I.F. к следующему и всему его NULL !!

+1

Я предполагаю, что объект «object1» совпадает с «object_1», но «запас» также «object_1»? И «отображает» статический метод? Кажется, что он статичен в вашем последнем фрагменте кода, но определение (если «фон» и «объект1» одинаковы), похоже, не является статическим методом. Я не знаю, если я еще медленнее, чем обычно, в это раннее воскресное утро, но ваш выбор кода кажется мне немного запутанным. –

ответ

1

AFAICT, object_1 и object_2 - это не связанные классы (за исключением того, что они друзья). Так что object_2 не имеет отношения к object_1.

Поэтому, когда вы пытаетесь напечатать object_2, как если бы это было object_1, это не сработает. Удивительно, что этот вызов работает на всех:

ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
object1::display(out) //Calls method display in object1's I.F. 
return out; 
} 

поскольку нет object_1 здесь, для которых метод можно назвать (но тогда, вы, вероятно, не имел в виду, что это реальный код, так как он отсутствует точка с запятой).

Не совсем понятно, чего вы хотите достичь. Может быть, вы хотите, чтобы object_2 унаследовал от object_1, так что любые object_2 также будут иметь членов pCh_mem1 и т. Д.? Возможно, вы хотите, чтобы член object_2 был объектом типа object_1?

+0

Я хочу, чтобы object_2 наследовался от object_1 – user40120

+0

@lampshade: ok, так что просто продолжайте и создайте 'object_1' базовый класс' object_2'. Возможно, вы захотите, чтобы члены были защищены, чтобы «object_2» смог получить к ним доступ. –

+0

Спасибо, мистер Л. Вы были очень полезны =), вызвав еще одну из моих многочисленных проблем. Это было просто исправление! =) – user40120

0
ostream& operator<<(ostream& out, const object_2& obj_2) 
{ 
    out << object_1[thatIndexThatIstoreditAt] 
    return out; 
} 

Мне нужно написать несколько отчетов об этом материале. =)

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