Różnica między klasami a przestrzeniami nazw?

Patrzę na przestrzenie nazw i nie widzę różnicy między nimi a klasami. Uczę się c++ mam kilka książek w Internecie, więc wiem, że nie uczę się najskuteczniej. W każdym razie czy ktoś może mi powiedzieć, jaka jest różnica między tymi dwoma i jaki byłby najlepszy czas, aby użyć przestrzeni nazw zamiast klasy. Poza tym nie widzę zbyt wiele o strukturach w książce, którą czytam.

Czy to jest format?

struct go
{

  goNow(){ cout << "go Now"};

}
Z góry dziękuję za pomoc.
Author: PythonJin, 2010-07-06

6 answers

Klasy i struktury definiują typy. Możesz utworzyć obiekt typu. Przestrzenie nazw po prostu deklarują zakres, w którym mogą istnieć inne typy, funkcje, obiekty lub przestrzenie nazw. Nie można utworzyć obiektu typu std (o ile oczywiście nie został utworzony Typ o nazwie std, który ukryłby przestrzeń nazw std).

Kiedy definiujesz funkcję wewnątrz struktury / klasy (metody), mówisz: "Ta funkcja jest podstawową operacją na powiązanych danych". Gdy zdefiniujesz funkcję wewnątrz przestrzeni nazw mówisz "Ta funkcja jest logicznie powiązana z innymi funkcjami, typami i obiektami w przestrzeni nazw"

Edit

Warto chyba zauważyć ,że" wszystko jest obiektem " języki takie jak Java i C# regularnie używają klas tak, jakby były przestrzeniami nazw, ponieważ nie pozwalają na "wolne" funkcje. To może być miejsce, skąd bierze się zamieszanie. Jeśli masz klasę w innym języku, która zawiera tylko statyczne elementy, powinieneś użyć przestrzeń nazw i darmowe funkcje w wersji C++.

 62
Author: Cogwheel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 17:08:46

Możesz szukać w Internecie różnic i jestem pewien, że znajdziesz wiele; ale następujące są ważne IMHO:-

  • możesz ponownie otworzyć przestrzeń nazw i dodać rzeczy w jednostkach tłumaczeniowych. Ty nie można tego zrobić z klasami.
  • użycie klasy oznacza, że można utworzyć instancję tej klasy, a nie true z przestrzeniami nazw.
  • możesz użyć using-deklaracje z przestrzenie nazw, a to nie jest możliwe z klasami, chyba że uzyskasz od nich.
  • możesz mieć nienazwane przestrzenie nazw.

Przestrzeń nazw definiuje nowy zakres i mówi się, że członkowie przestrzeni nazw mają zakres. Zapewniają one sposób na uniknięcie kolizji nazw (zmiennych, typów, klas lub funkcji) bez niedogodności związanych z obsługą klas zagnieżdżonych.

 23
Author: Abhay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 17:17:07

A klasa jest typem danych. Jeśli masz klasę o nazwie Foo, możesz tworzyć obiekty klasy Foo i używać ich na wiele sposobów.

A przestrzeń nazw jest po prostu abstrakcyjnym sposobem grupowania elementów razem. Normalnie, nie możesz mieć dwóch funkcji w swoim programie o nazwie bar(). Jeśli umieścisz je w oddzielnych przestrzeniach nazw, mogą one współistnieć (na przykład jako A::bar() i B::bar()). Przestrzeń nazw nie może być utworzona jako obiekt; pomyśl o niej bardziej jako o konwencji nazewnictwa.

Jeśli piszesz kod, który chcesz powiązać z obiektem , który możesz zdefiniować i użyć jako zmiennej, napisz klasę . Jeśli piszesz API lub bibliotekę i chcesz zawinąć wszystkie funkcje i stałe, aby ich nazwy nie kolidowały z niczym, co Napisał użytkownik, użyj przestrzeni nazw .

 11
Author: bta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:31:36

Przestrzeń nazw jest sposobem grupowania identyfikatorów, aby nie kolidowały ze sobą.

Klasa jest defeinition obiektu, który może być instancją (Zwykle) i który enkapsuluje funkcjonalność i stan.

Przestrzenie nazw i klasy są zupełnie różne i służą różnym celom. Mają pewne podobieństwa składniowe.

Struktury są klasami, z innym domyślnym określnikiem dostępu (public dla struct, private dla class) - we wszystkich innych aspektach są takie same.

 8
Author: Ragster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:28:30

Jedną z głównych różnic jest to, że przestrzenie nazw mogą być ponownie otwierane, ale klasy nie mogą być:

namespace A {
    int f1();
}

namespace A {
    int f2();
}

Jest legalne, ale:

class A {
    int f1();
};

class A {
    int f2();
};

Nie jest

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:33:45

Z Wikipedii

Ogólnie rzecz biorąc, przestrzeń nazw jest abstrakcyjnym kontenerem zapewniającym kontekst dla elementów (nazw, terminów technicznych lub słów), które przechowuje i pozwalającym na wyodrębnienie elementów homonimicznych o tej samej nazwie (znajdujących się w różnych przestrzeniach nazw). z reguły nazwy w przestrzeni nazw nie mogą mieć więcej niż jednej pisowni, to znaczy jej składniki nie mogą mieć tej samej nazwy . Przestrzeń nazw jest również nazywana kontekstem, ponieważ poprawne znaczenie nazwy może się zmieniać w zależności od jaka przestrzeń nazw ma zastosowanie. Nazwy w nim mogą reprezentować zarówno przedmioty, jak i pojęcia, niezależnie od tego, czy jest to język naturalny, czy etniczny, język skonstruowany, terminologia techniczna zawodu, dialekt, socjolekt, czy język sztuczny (np. język programowania).

Z drugiej strony A class defines a type.

Przestrzeń nazw może zawierać wiele klas.

EDIT

Jedna różnica byłaby taka:

Możesz mieć nienazwane przestrzenie nazw, ale nie możesz mieć unnamed class

    namespace{    //fine

           //some code....
    }

    class{   //illegal
    }
 0
Author: Prasoon Saurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 16:40:44