【问题标题】:Objects and Operator Overloading C++对象和运算符重载 C++
【发布时间】:2011-08-17 03:09:03
【问题描述】:
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 的实现文件是典型的。 Tor,Dtor和一些方法。我没有在标题中发布方法声明,因为它们与我的问题无关。

我讨论对象的生命周期非常重要。这是我真正需要理解的东西。发生的事情是,当我在 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);

然后在我打印格式化方法之后,我需要打印从 main 传递到第一个对象的 ctor 的信息;对象_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 像你上面看到的那样被调用,object2 的类的操作符重载就会被调用。我不能使用我的任何私人成员,因为它是非法操作。我想我的问题是。如何在我的对象 2 的运算符重载函数中从对象 1 打印我的私有成员? static_cast 的?我有一个来自 main 的随机 sn-p,它很复杂,我无法更改。

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

正如您在上面看到的,我一直在尝试做的是调用其他对象的方法,并从它们那里获取信息。但是那个信息都是NULL!!我从一个 I.F.到下一个,它都是NULL!

【问题讨论】:

  • 我假设“object1”与“object_1”相同,但“stock”也是“object_1”吗? “显示”是一种静态方法吗?在您上一个代码 sn-p 中的调用中似乎是静态的,但定义(如果“stock”和“object1”相同)似乎不是静态方法。我不知道这个星期天早上我是不是比平时还要慢,但是你选择的代码让我有点困惑。

标签: c++


【解决方案1】:

AFAICT、object_1object_2 是不相关的类(除了它们是朋友)。所以object_2 没有任何与object_1 相关的状态。

因此,当您尝试像打印object_1 一样打印object_2 时,这不可能工作。令人惊讶的是,这个调用完全有效:

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 类型的对象?

【讨论】:

  • 我希望 object_2 从 object_1 继承
  • @lampshade: 好的,所以继续将object_1 设为object_2 的基类。您可能希望对成员进行保护,以便object_2 能够访问它们。
  • 谢谢L先生,您非常乐于助人=) 引发了我许多被忽视的问题中的另一个问题。这只是一个简单的修复! =)
【解决方案2】:
ostream& operator<<(ostream& out, const object_2& obj_2)
{
    out << object_1[thatIndexThatIstoreditAt]
    return out;
}

我需要写一些关于这些东西的报告。 =)

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 2020-10-14
    • 2012-11-26
    • 1970-01-01
    • 2012-06-16
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多