2013-04-05 15 views
5

W C++ wszystko, co chcę zrobić, to zadeklarować klasę DisplayInfo w pliku DisplayInfo w pliku .h, a następnie w pliku .cpp, nie trzeba wpisywać pierwszej DisplayInfo::DisplayInfo() i każdej definicji funkcji.Czy mogę uniknąć używania nazwy klasy w pliku .cpp, jeśli zadeklaruję obszar nazw w nagłówku?

Niestety, obejrzałem ponad 20 tematów i moją książkę C++ już ponad dwie godziny i nie mogłem tego rozwiązać. Myślę, że to dlatego, że próbuję użyć mojego 10-letniego szkolenia java w C++.

1-ty trial:

//DisplayInfo.h 
namespace DisplayInfoNamespace 
{ 
    Class DisplayInfo 
    { 
    public: 
    DisplayInfo(); //default constructor 
    float getWidth(); 
    float getHeight(); 
    ... 
    }; 
} 

//DisplayInfo.cpp 
using namespace DisplayInfoNamespace; //doesn't work 
using namespace DisplayInfoNamespace::DisplayInfo //doesn't work either 
using DisplayInfoNamespace::DisplayInfo //doesn't work 
{ 
    DisplayInfo::DisplayInfo() {}; //works when I remove the namespace, but the first DisplayInfo:: is what I don't want to type 
    DisplayInfo::getWidth() {return DisplayInfo::width;} //more DisplayInfo:: that I don't want to type 
    ... 
} 

Na drugim badaniu, starałem przełączania kolejności, więc było

class DisplayInfo 
{ 

    namespace DisplayInfoNamespace 
    { 
    ... 
    } 
} 

iw pliku .cpp, wypróbowaniu wszystkich powyższych Plus

using namespace DisplayInfo::DisplayInfoNamespace; 

Dla trzeciej próby próbowałem przekazania dalej, deklarując ją z następującym nagłówkiem:

namespace DisplayInfoNamespace 
{ 
    class DisplayInfo; 
} 
class DisplayInfo 
{ 
public: 
...all my methods and constructors... 
}; 

Używam VisualStudio2010 wyrażania i mimo starannie czytać komunikaty o błędach nie udało się znaleźć odpowiedni układ klas i przestrzenie nazw w pliku nagłówka i .cpp, aby to wyszło.

A teraz po tym, jak spędziłem 30 minut, wpisując to, czy odpowiedź brzmi: C++: "Class namespaces"?? (aka nie, musisz użyć typedefs?)

Odpowiedz

0

Nie ma sposobu na skrócenie składni definicji A::A(), gdy robisz to poza klasą.

w klasie umożliwi Ci zdefiniowanie funkcji w miejscu bez użycia havinf, aby wybrać poprawny zakres.

przykład:

// in *.h 
namespace meh { 
    class A { 
    public: 
    A() { 
     std::cout << "A construct" << std::endl; 
    } 

    void foo(); 
    void bar(); 
    } 

    void foo(); 
} 

void foo(); 


// in *.cpp 

void foo() { 
    std::cout << "foo from outside the namespace" << std::endl; 
} 

void meh::foo() { 
    std::cout << "foo from inside the namespace, but not inside the class" << std::endl; 
} 

void meh::A::foo() { 
    std::cout << "foo" << std::endl; 
} 


namespace meh { 
    void A::bar() { 
    std::cout << "bar" << std::endl; 
    } 
} 

Jak widać, nazw raczej dodać coś innego, aby umieścić w przedniej części nazwy metody, zamiast usunąć jeden.

+0

Dzięki, ale wydaje się to tak dziwne, że nie można tego obejść. Czy mam zdefiniować klasę w pliku .cpp czy coś takiego? – user2247872

+0

nie, ale jeśli nie, musisz określić skąd pochodzi foo() (w przykładzie). Będę edytować, aby to wyczyścić. – scones

+0

Jeśli chcesz zrzucić plik źródłowy i trzymać się nagłówka (co jest potrzebne przy definiowaniu klasy/funkcji szablonu), możesz umieścić swoją implementację w nagłówku i nie musisz dodawać zakresu klasy przed deklaracja funkcji, ponieważ są to również definicje. – rbaleksandar

Powiązane problemy