运营商总是需要有参数吗?

时间:2015-11-27 13:57:45

标签: c++

33 33 C:\ Users \ gauthjer \ AppData \ Local \ Temp \ Temp1_Ok.zip \ _squareangles.cpp [错误]'矩形运算符++()'必须有类或枚举类型的参数

我创建了一个程序,后者想要注册编译器错误。我的问题是:附加费运营商(超越)是否总是需要参数?

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std ; 

class rectangle{

    double longueur;
    double largeur;

    public : 

    rectangle(double a = 0, double b = 0){ longueur = a; largeur = b; }

    void setDimension(double longu, double larg);
    double getLong() const;
    double getLarg() const;
    double surface() const;
    double perimeter()const;

    friend ostream & operator << (ostream &, const rectangle & flot);
    friend istream & operator >> (istream &, rectangle & flot);
    friend rectangle operator + (rectangle, rectangle);
    friend rectangle operator * (rectangle, rectangle);
    friend rectangle operator == (rectangle, rectangle);
    friend rectangle operator != (rectangle, rectangle);
    **friend rectangle operator ++  ();**
    friend rectangle operator ++  (int);
};

// Je dois utiliser longu au lieu de long comme demande dans le tp - long est un type d'argument (comme double)
void rectangle :: setDimension(double longu, double larg) {
    longueur = longu;
    largeur = larg;
}

void rectangle :: getLong() const{

    return longueur; 
}

void rectangle :: getLarg() const{

    return largeur; 
}

void rectangle :: surface() const{

    return longueur * largeur;
}

void perimeter :: perimeter() const{

    return 2*longeur + 2*largeur;
}

ostream & operator << (ostream & sortie, const rectangle & flot){

sortie << "(" << flot.longueur << "," << flot.largeur << ")";
return sortie;
}

istream & operator >> (istream & entree, rectangle & flot){

    char c = '\0';
    int longueur, largeur;
    bool ok = true;
    entree >> c; 
    if(c != '(') ok = false;
        else{ 
        entree >> longeur >> c;
            if (c != ',') ok = false;
                else{
                    entree >> largeur >> c;
                    if (c != ')') ok = false;
                }
        }
if(ok)  {flot.setDimension(longueur, largueur)}
    else entree.clear(ios::badbit | entree.rdstate() );
    return entree;

}

rectangle operator + (rectangle a, rectangle b){
    rectangle rectangle1;

    rectangle.longueur = a.longueur + b.longueur;
    rectangle.largeur = b.largeur + b.largeur; 
    return rectangle1;  
}

rectangle operator * (rectangle a, rectangle b){
    rectangle rectangle1;

    rectangle.longueur = a.longueur * b.longueur;
    rectangle.largeur = b.largeur * b.largeur; 
    return rectangle1;  
}

rectangle operator == (rectangle a, rectangle b){

    if (a.longueur == b.longueur && a.largeur == b.largeur) return true;
    else return false;  
}

rectangle operator != (rectangle a, rectangle b){

    if (a.longueur != b.longueur || a.largeur != b.largeur) return true;
    else return false; 
}


rectangle operator ++ (){

    longueur ++ ; largeur++ ; 
    return *this ;  
}

rectangle operator ++  (int n){
    rectangle rectangle1 = *this ;

    longueur++ ; largeur++ ;
    return rectangle ;  
}

2 个答案:

答案 0 :(得分:2)

operator++的修复前和修复后版本最好是作为成员函数实现,而不是非成员朋友,并且您将其声明为非成员的签名不正确。

您应该删除friend以便它们是成员函数并按以下方式定义它们:

rectangle& rectangle::operator ++() {
//       ^ probably don't want to copy for pre-increment
    //...
}

rectangle rectangle::operator ++(int) {
    //...
}

答案 1 :(得分:1)

  

运营商是否总是需要参数?

是。 c ++中没有nullary运算符。即使在rectangle::operator ++()的情况下,参数列表显示为空,也有一个隐藏的参数,因为它是一个成员运算符。成员运算符(如成员函数)具有隐藏的隐式对象参数。如果将操作符实现为firend,则该object参数必须明确地成为参数列表的一部分。

如果要为具有rectangle类型的预增量运算符定义重载,则重载必须具有该类型的单个参数。就像预增量运算符的任何其他重载一样:

friend rectangle operator ++(rectangle&);

或者将其声明为成员函数,在这种情况下,隐式对象参数是唯一的参数。