对象和运算符重载C++

问题描述:

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的实现文件很典型。 Ctor,Dtor和一些方法。我没有发布方法声明在标题中,因为它们与我的问题无关。对象和运算符重载C++

这是非常重要的,我讨论的对象一生。这是我真的需要了解的东西。发生的事情是,当我在main中调用object_2时,调用运算符重载函数。那么接下来的操作符重载函数被调用:

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的所有打印到控制台。我的物体是否超出了范围?我想是的,因为当我在需要之前完成所有这些工作时,它可以正常工作。也就是说,当我将这个函数称为运算符超载的主体时,它就起作用。我想是因为对象是重新声明:

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

再经过我打印格式化方法我需要打印在从主传递到第一个对象的构造函数的信息; object_1。当发生这种情况时,我们处于类似的重载函数中,它的实现文件也是相同的。 IM呼叫从过载的第二对象过载功能这两种方法:

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被调用就像你在上面看到的那样,那么object2的类的运算符重载将被调用。我不能使用我的任何私人成员,因为它是非法操作。我想我的问题是。我如何打印我的object2中的我的私人成员在我的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!我从一个国际跳板跳来跳去到下一个,它的所有NULL!

+1

我假设“object1”与“object_1”相同,但是“stock”也是“object_1”?并且“显示”一种静态方法?在最后一段代码中调用它似乎是静态的,但是定义(如果“stock”和“object1”是相同的)似乎不是一个静态方法。 在这个星期天早上我不知道我是否比平时慢,但是你选择的代码对我来说似乎有点混乱。 – 2009-10-04 05:38:09

AFAICT,object_1object_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 2009-10-04 05:27:42

+0

@lampshade:好的,那么继续吧,让'object_1'成为'object_2'的基类。你可能想让这些成员受到保护,以便'object_2'能够访问它们。 – 2009-10-04 05:47:44

+0

谢谢Mr.L你一直很有帮助=)这是我的另一个被忽视的问题。这只是一个简单的修复! =) – user40120 2009-10-04 05:54:40

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

我需要写这个东西的几个报告。 =)