C++ i domyślny argument funkcji w klasie

0

Witam,
Chciałbym, by moja funkcja w klasie przyjmowała opcjonalnie argument domyślny. Wiem, że mogę stworzyć dwie funkcje robiące prawie to samo i skorzystać z przeciążenia nazw funkcji, ale to rozwiązanie mi się nie podoba i wolę przyjąć argument domyślny i nie dublować kodu.

main.cpp

#include<iostream>
#include "klasa.h"
using namespace std;

int main()
{
  funkcja();
  funkcja(3);
  return 0;
}
class klasa {
public:
  void funkcja(int);
};

klasa.h

#include <iostream>
#include "klasa.h"

using namespace std;

void klasa::funkcja(int domyslny = 0) {
  cout << "Podany argument: " << domyslny << endl;
}

klasa.cpp

g++ -o main main.cpp klasa.cpp
main.cpp: In function ‘int main()’:
main.cpp:7:11: error: ‘funkcja’ was not declared in this scope
make: *** [all] Błąd 1

Pozdrawiam,

0

Wartość domyślną definiuje się w deklaracji a nie w definicji funkcji.
Czyli

class klasa {
public:
  void funkcja(int domyslny = 0);
};
void klasa::funkcja(int domyslny) {
  cout << "Podany argument: " << domyslny << endl;
}
0

Domyślny argument musi być w nagłówku i tylko tam.

0

Mówiąc dokładniej-określenie parametru domyślnego można umiejscowić i w definicji i w deklaracji,ALE tylko w 1 z tych miejsc na raz.
I generalnie to stosuje się umieszczanie w deklaracji funkcji.

0

Obejscie:

#include<iostream>
#include "klasa.h"
using namespace std;

int main()
{
  klasa a;
  a.funkcja();
  a.funkcja(3);
  return 0;
}

class klasa {
public:
void funkcja();
void funkcja(int);
};

```cpp
#include <iostream>
#include "klasa.h"

using namespace std;

void klasa::funkcja(int arg) {
  cout << "Podany argument: " << arg << endl;
}

void klasa::funkcja() {
  funkcja(0);
}

Uzyskałem to co chciałem bez dublowania kodu. Teraz próbuje wykorzystać, zgodnie z sugestią, domyślny warunek tylko i wyłącznie w definicji funkcji (definicja jest częscią definicji klasy):

class klasa {
public:
  void funkcja(int domyslny = 0);
};
#include <iostream>
#include "klasa.h"

using namespace std;

void klasa::funkcja() {
  cout << "Podany argument: " << domyslny << endl;
}

Kompilator:

g++ -o main main.cpp klasa.cpp
klasa.cpp:6:6: error: prototype for ‘void klasa::funkcja()’ does not match any in class ‘klasa’
klasa.h:3:8: error: candidate is: void klasa::funkcja(int)
make: *** [all] Błąd 1

Po wpisaniu w klasa.cpp tego samego co w definicji tzn.

#include <iostream>
#include "klasa.h"

using namespace std;

void klasa::funkcja(int domyslny = 0) {
  cout << "Podany argument: " << domyslny << endl;
}

g++ -o main main.cpp klasa.cpp
klasa.cpp:6:37: error: default argument given for parameter 1 of ‘void klasa::funkcja(int)’ [-fpermissive]
klasa.h:3:8: error: after previous specification in ‘void klasa::funkcja(int)’ [-fpermissive]
make: *** [all] Błąd 1
0

Bo w definicji ma być tak:

void klasa::funkcja(int domyslny)
{
    ...
}
0

@MasterBLB
Jeżeli zapisałeś to następująco

#include <iostream>
using namespace std;

void f(int);
void f(int = 3)
{
	cout << a << endl;
}

int main()
{
	f();
	getchar();

	return 0;
}

To dopuszcza standard języka, dochodzi tu do przesłonięcia nazwy funkcji. To samo daje kod:

#include <iostream>
using namespace std;

void f(int);
void f(int = 3);

int main()
{
	f();
	getchar();

	return 0;
}

void f(int a)
{
	cout << a << endl;
}

Ale wystarczy, że usuniesz deklarację z domyślnym argumentem i w definicji umieścisz ten domyślny argument i już wyskoczy Ci błąd

#include <iostream>
using namespace std;

void f(int);

int main()
{
	f();
	getchar();

	return 0;
}

void f(int a = 3)
{
	cout << a << endl;
}

Na 161 stronie w standardzie C++: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf

0

@MJay
No więc nie.
W h mam tak:

class LoggerDLLTest : public QMainWindow
{
public:
	void testfunc(int i);
}

i w cpp:

void LoggerDLLTest::testfunc(int i=10)
{
}

ten kod Visual Studio 2003 kompiluje mi bez dąsów.Ale jak wiadomo nie od dziś,VS ze standardami jest nieco na bakier.

Także do autora-zawsze stosuj deklaracje parametrów domyślnych przy deklaracji metody klasy.Czytelniej dla używającego klasy,czytelniej podczas kodowania bo ide podpowiadając parametry metody pokazuje zarazem te domyślne wartości,oraz bardziej przenośnie międzysystemowo z uwagi na trzymanie się standardu.

0

To radzę zmienić kompilator ;-D MSVS2010 podobnie jak MSVS2008 przy trzecim przykładzie wykazują błąd

1>c:\users\mjay\documents\visual studio 2008\projects\checker\checker\main.cpp(8) : error C2660: 'f' : function does not take 0 arguments

1>c:\users\mjay\documents\visual studio 2010\projects\checker\checker\main2.cpp(8): error C2660: 'f' : function does not take 0 arguments

1 użytkowników online, w tym zalogowanych: 0, gości: 1