zaawansowane użycie konstruktora

0
class eq {
int a, b;
bool sign;
};

eq test = -18/17;

Czy w jakiś sposób mogę w w klasie w tym przykładzie otrzymać a = 18, b = 17, sign = 0? Wydaję mi się, że wykonane będą to działania całkowite i dostane

eq test = -1;

równoważne z

eq test (-1);

Chciałbym stworzyć klase do obsługi liczb wymiernych i zastanawiam się, jak mają działać konstruktory i konwersje. Wywołania typu:

eq test ("-18/17");
eq test (18, 17, '-');

są mało naturalne.

0

Wystarczą licznik i mianownik. Znak idzie razem z którymś z nich. Popatrz sobie na std::ratio.

0

Gdyby znak szedł z którejś z liczby, to mógłbym przechowywać mniejsze wartości, dlatego sądze, że lepszym pomysłem będzie trzymanie znaku osobno. Chyba będę przekazywał to jednak jako string.

0

@twonek : chce w ten sposób jedynie konstruować obiekty i dokonywać konwersji opcjonalnie.

0

Dla mnie to:

eq test(18, 17, false);

oznacza mniej roboty i problemów niż

eq test("-18/17");
  • napisanie funkcji konwertującej.
0

Ja bym to raczej widział jako:

// powinno dać ten sam ułamek
eq test (18, 17, -1);
eq test (-18, 17);
eq test (18, -17);
eq test (18, -17, 0);
eq test (18, -17, 1);

0

Skoro już dwie osoby tak mówią..
Mam funkcje składową reduce(), która "skraca ułamek". Właściwie rzecz biorąc jego wartość się nie zmienia, dlatego chcę, żeby możliwe było jej wywołanie dla wartości zarówno stałych, jak i nie. Rozwiązaniem jest jedynie mutable?

0

Nie wiem do czego to Ci potrzebne, ale jeżeli do czegoś innego niż cele edukacyjno/naukowe istnieje coś takiego jak boost rational.
Pozdrawiam

0

Po co ci pole sign?

0

Aj tam struktury, pttpf

#include <iostream>
#include <tuple>
using namespace std;

constexpr auto calc(auto a, auto b, auto op){
	return op == '+'? a+b:
		   op == '-'? a-b:
		   op == '*'? a*b:
		   op == '/'? a/b:
		   			 a;
};

int main() {
	int a, b, c;
	tie(a, b, c) = make_tuple(-18, 17, '*');
	cout << calc(a, b, c);
	return 0;
}
0
anonymous23456 napisał(a):

Gdyby znak szedł z którejś z liczby, to mógłbym przechowywać mniejsze wartości, dlatego sądze, że lepszym pomysłem będzie trzymanie znaku osobno. Chyba będę przekazywał to jednak jako string.

Skoro używasz typu int, a nie unsigned int to i tak możesz przechowywac mniejsze liczby.

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