2015-06-29 2 views
0

Например, это:Можно ли установить ссылку на объект класса как параметр по умолчанию в C++ без const?

Class Point{ 
    double x, y; 

public: 
    Point(); 
    bool testequal(const Point& p1, Point& p2 = Point()) const; 
} 

не работает. Это дает мне ошибку:

error: could not convert 'Point()' from Point to Point& 

Это работает, если я использую его в качестве,

bool testequal(const Point& p1, const Point& p2 = Point()) const; 

или

bool testequal(const Point& p1, Point p2 = Point()) const; 

Но вместо этого я хочу использовать объект p2 в качестве опорного значения, данные могут быть изменены внутри реализации.

Редактировать:

Вот полная программа. Да, это тривиально - я бы предпочел, если бы вы не оценили необходимость этого кода, а вместо этого прокомментировали, можно ли его реализовать.

Если нет, не могли бы вы указать, почему и скажите мне, как правильно это сделать. Перегружает только один вариант?

#ifndef __POINT_H__ 
#define __POINT_H__ 

Class Point{ 
    double x, y; 

public: 
    Point(); 
    Point(double xx, double yy); 
    bool testequal(const Point& p1, Point& p2 = Point()) const; 
// this declaration fails. alternative is to use const Point& p2 or Point p2. 
// but it is vital that the default parameter should store some value in 
// it which can be accessed at the function call location without returning it. 
} 


#include "Point.h" 

Point::Point(): x(0), y(0) {} 

Point::Point(double xx, double yy): x(xx), y(yy) {} 

bool Point::testequal(const Point& p1, Point& p2){ 
    if (this->x == p1.x && this->y == p1.y){ 
     p2.x = this->x; 
     p2.y = this->y; 
     return true; 
    } 
    else 
     return false; 
} 
+1

Первый способ не может работать, почему вы хотите сохранить ссылку на временный? Вы застрянете с болтающейся ссылкой. Он должен быть либо по значению, либо по константной ссылке, что продлит время жизни. – CoryKramer

+3

временно не может быть привязан к неконтактной ссылке. – Jarod42

+0

Это недопустимый синтаксис C++, в котором задается вопрос, о котором вы спрашиваете. Покажите нам код _actual_, который вы _actually_ компилируете. –

ответ

4

Вы можете добавить перегрузку:

bool testequal(const Point& p1, Point& p2) const; 
bool testequal(const Point& p1) const 
{ 
    Point dummy; 
    return testequal(p1, dummy); 
} 
+0

есть ли решение для этого без перегрузки? – kkprime

+0

@kkprime: http://stackoverflow.com/q/2816293/560648 Я думаю, что поиск слишком сложный :( –

+0

@LightnessRacesinOrbit Я нашел этот вопрос. Но не смог реализовать его для пользовательского типа данных, как в моем примере класса Point – kkprime

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