-3

头文件

#ifndef deneme_h
#define deneme_h

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std ;
class A
{
public:
Course ( int code ) ;
int getACode () ;


 private:

    int code   ;

};


class B
{

  public:
    B ( A * a  = NULL) ;
        A     * getA     () ;

 private:

    A     * a   ;
  friend ostream & operator<< ( ostream & out , B & b ) ;
};

#endif

A.cpp

#include "deneme.h"
using namespace std ;


A :: A ( int code )
{
    this -> code = code;
} 

int A :: getACode()
{
    return this -> code;
}

B.cpp

#include "deneme.h"

using namespace std ;

B::B ( A     * a ) 
    {
        this -> a = new A(223);
        this -> a = a;

    }
A * A::getA     ()  {   return this -> a;}



ostream & operator<< ( ostream & out , B & b ) { out << b.course->getACode();}

和 main.cpp

#include "deneme.h"
using namespace std;

int main(){

Course* c1 = new Course(223) ;

Offering* o1_1 = new  Offering(c1);

cout<< *o1_1;

return 0;
}

大家好

我想问一下这段代码。上面的代码工作正常,它打印 223。但是当我更改 B.cpp 中的运算符重载部分时

 ostream & operator<< ( ostream & out , Offering & offering ) { out << offering.(getCourse() )->getCourseCode();}

我得到一个错误。为什么会报错?我不能使用返回值。感谢您的回答。

4

3 回答 3

2

如前所述,您需要返回,我认为您想要的行是:

ostream & operator<< ( ostream & out , Offering & offering ) { out << ( offering.getCourse() )->getCourseCode(); return out; }

(我移动了一个括号)

于 2012-10-19T09:22:36.323 回答
1

删除 getCourse() 周围的括号

于 2012-10-19T09:26:01.447 回答
0

与 iostream 一起使用时:

operator<<应该通过 const 引用(或值,如果那是微不足道的)来获取它的第二个参数。

它应该返回它的第一个参数。

所以

ostream & operator<< ( ostream & out , const B & b ) 
{ 
     return out << b.course->getACode();
} 

ostream & operator<< ( ostream & out , const Offering & offering ) 
{ 
    return out << offering.getCourse()->getCourseCode();
} 

在这两种情况下,您也可以return out在另一个语句之后放置一个单独的语句。

另请注意,在 C++ 中,您不必使用 new 创建所有对象。

于 2012-10-19T09:22:55.480 回答