Wczytywanie zmiennej do klasy i wypisywanie błędu preprocesora

0

Witam. Napisałem sobie dla treningu klasę binary. Z założenia przechowuje ona tylko kod zero-jedynkowy. Liczba binarna zapisywana jest w zwyczajnej zmiennej typu int. Przy wczytywaniu wartości do zmiennej(przeciążone operatory) chcę automatycznie sprawdzać, czy wprowadzona liczba składa się tylko z zer i jedynek, a jeżeli nie, to niech zwróci błąd preprocesora. Umiem napisać sprawdzanie liczby oraz zwracanie błędu, jednak nie wiem za bardzo jak je zazębić, tzn. jak w zwykłym if'ie bądź if'ie preprocesora sprawdzić wartość zmiennej typu bool i wyświetlić error preprocesora, jeżeli wartość jest równa false. Próbowałem czegoś takiego:

bool sth = false;
//Sprawdznie czy wprowadzona liczba jest liczbą binarną
if(!sth)
	#error You must enter a binary num

Jednak błąd jest wywoływany od razu przy próbie kompilacji, program nawet się nie uruchamia. Proszę o pomoc.

0

o_O Ale przeciez preprocesor działa tlyko na etapie kompilacji i to jako pierwszy krok. W związku z tym nie bardzo rozumiem co ty chcesz zrobić.

0

Chcę, aby taki kod:

#include <binary>
using namespace std;
int main()
{
	binary b = 22;
}

zwrócił błąd w stylu czegoś takiego:

using namespace std;
int main()
{
	int a = "10";
}
0

Słówko explicit przed konstruktorem?

0

Działa prawie dobrze, ale czy istnieje możliwość sterowania tym przy pomocy zwykłego ifa, bo zostałem pozbawiony możliwości przypisania wartości przy deklaracji(chce konwersji z int na binary).

1

explicit to nie to, o co chodzi. OP chce sprawdzić, czy liczba ma same 0 i 1 tzn: binary x = 1010101;. static_assert może pomóc, jeżeli umiesz sprawdzić to podczas kompilacji, a jak nie to po prostu zwróć jakiś błąd (wyrzuć wyjątek) podczas działania. Tylko to co próbujesz zrobić jest troszkę niemądre - w liczbie int za dużo bitów nie zapiszesz w ten sposób a jak ktoś napisze na początku zero, to będzie liczba ósemkowa.

Literały binarne można w całości zaimplementować za pomocą szablonowej magii tak, żeby wszystko było robione podczas kompilacji. Tylko ma to średni sens - GCC ma rozszerzenie do takich literałów a w C++14 będą one w standardzie. Nie mniej jednak jest to całkiem fajna zabawa.

0
 binary b(22); // zadziała

jeżeli o to chodzi.

0

Chodzi mi o zrobienie klasy odpornej na różne pomysły użytkownika, która wczyta tylko i wyłącznie kod 0-1, a inne próby odbije.

1
cPlusPlus napisał(a):

Chcę, aby taki kod:

#include <binary>
using namespace std;
int main()
{
	binary b = 22;
}

zwrócił błąd w stylu czegoś takiego:

using namespace std;
int main()
{
	int a = "10";
}

Podejrzewam, że nie o to chodziło, ale dokładnie o to poprosiłeś.
http://ideone.com/Yisn9l

0
error: 'is_same' was not declared in this scope

?
Pod czym kompilowałeś?

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