2013-02-14 11 views
6

To nie może być pytanie specyficzne dla C++ i ma więcej wspólnego z programowaniem zorientowanym obiektowo. Jestem na tym nowym i wątpię w swój projekt. Mam klasy Parser, który zasadniczo implementuje wiele funkcji do przetwarzania wyrażeń, konwersji z infix do postfiksa itp. Używam tych funkcji Parser w funkcji głównej. Zdałem sobie sprawę, że nie potrzebuję żadnych członków danych dla tej klasy. Dlatego tak naprawdę nie potrzebuję przedmiotu tej klasy. W związku z tym w efekcie sprawiłem, że każda funkcja stała się statyczna w klasie. Czy jest coś dziwnego w tym projekcie. Czy powinienem mieć to jako interfejs? Jakieś sugestie?Klasa bez elementów danych w C++

+6

Ogólnie w C++ można umieścić funkcje nie będące członkami wewnątrz przestrzeni nazw. Klasa nie musi grupować takich funkcji. – juanchopanza

+1

Jeśli masz tylko jeden analizator składni, zrobi to przestrzeń nazw. Jeśli masz Parser1 i Parser2 i chcesz móc użyć jednego, ten projekt jest rozsądnym sposobem, aby to zrobić. –

+0

Dlaczego nie dwie różne przestrzenie nazw? – user592748

Odpowiedz

6
  1. chcesz parser i wiesz co chcesz to zrobić dla Ty - to w efekcie twój "interfejs".

  2. Twoja obecna implementacjaparsera nie potrzebuje żadnych zmiennych członkowskich - dlatego, aby zaimplementować twój interfejs, nie potrzebujesz klasy. Więc tak, zróbcie z waszymi statycznymi metodami. Tak jak mówi Kevin, używanie przestrzeni nazw o prostych starych funkcjach (nie statycznych) jest świetnym pomysłem.

  3. Jeśli uważasz, że musisz dodać nowy parser, który BĘDZIE potrzebował utrzymania stanu wewnętrznego, prawdopodobnie będziesz chciał zdefiniować interfejs w (1) - zwykły, publicznie widoczny plik nagłówkowy z deklaracjami funkcji wewnątrz obszaru nazw Twój wybór jest wystarczający.

+0

Dzięki. To oczyszcza to. Kciuki w górę, aby wyjaśnić znaczenie interfejsu i wyjaśnić, jak radzić sobie z drugim przypadkiem. – user592748

+0

Nie ma za co. Miło, że mogłem pomóc. – Carl

+0

Metody statyczne nie mogą być automatycznie wywoływane z konstruktora obiektu nadrzędnego. – peterh

6

Klasa bez funkcji statycznych wydaje się być nieodróżnialna od przestrzeni nazw. Dlaczego więc po prostu nie używać przestrzeni nazw?

+0

Nie jestem pewien, jak bardzo jest to ważne, ale nie możesz kpić z przestrzeni nazw (w szykownych ramach, które znam). –

+0

Nie, klasa bez elementów danych _ może mieć konstruktora. – peterh

+1

Konstruktor nie jest interesujący, ponieważ nie różni się od innej statycznej funkcji. Destruktor może być interesujący, ale interesujący destruktor prawdopodobnie potrzebuje co najmniej jednego boolowskiego elementu danych, aby zapisać, czy klasa została przeniesiona (a zatem czy destruktor nie powinien robić nic ciekawego, co zamierzał zrobić). –

0

Często zdarza się, że funkcje narzędziowe są statyczne, więc jeśli funkcje klasy Parser nie polegają na sobie nawzajem, można całkowicie je ustawić jako statyczne. Jeśli opierają się one na siebie, a może to być możliwe, że te same funkcje mogą być wykonywane w inny sposób, należy wziąć pod uwagę, aby użyć interfejsu

1

Sposób decydowania o tym pytaniu dotyczy sposobu wykorzystania funkcji?

1) Jeśli wszystkie funkcje są używane w jednym pliku i nie trzeba ich eksportować w dowolnym miejscu, zdecydowanie używaj funkcji statycznych. Czemu? Ponieważ możesz po prostu wpisać je bezpośrednio w treść klasy w pliku .cpp i nie musisz się martwić o zachowanie deklaracji i wyrównanie parametrów. Ponieważ gdy parsowana jest klasa C++, cały kod wewnątrz każdej funkcji zdefiniowanej w treści klasy jest pomijany, a następnie analizowany, gdy wszystkie elementy klasy zostały zadeklarowane, więc wszystkie funkcje widzą się nawzajem i są w lepszej sytuacji nazw. Kompilator również wbuduje wiele mniejszych funkcji, jeśli zadeklarujesz je bezpośrednio w klasie.

2) Jeśli funkcje muszą być używane spoza bieżącego pliku .cpp, należy użyć normalnych funkcji. Ponieważ później można ich używać z dowolnego miejsca, a eksportowanie ich po nazwie jest łatwiejsze.