Seite 1 von 1

[C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 00:56
von BeRsErKeR
Wusste leider nicht wonach ich genau suchen muss, daher entschuldige ich mich schonmal falls es das schon gab (wovon ich fast ausgehe).

In der Regel bekommt der Compiler ja Bauchschmerzen wenn man ein Objekt genauso nennt wie den Typen. Beispiel:

Code: Alles auswählen

class foo { ... };
foo foo;
Dies kann man umgehen mit:

Code: Alles auswählen

class foo foo;
Soweit so gut. Nun habe ich folgendes Szenario:

Code: Alles auswählen

// foo.h
class foo
{
    static void bar(void);
};

extern class foo foo;


// foo.cxx
void foo::bar(void)
{
    foo.something = something_else;
}


// main.cxx
class foo foo;
Ich so: Bitte!
Der Compiler: Nö!

Oder anders (MSVC++ 2008): error C2059: syntax error : '.'


Mir ist bewusst, dass er hier vom Typ class foo ausgeht und nicht vom Objekt. Die Frage ist wieso. Liegt es am extern? Danke für Hinweise.

Antworten wie "nenn das Objekt einfach um" sind zwar nett, aber ich frage aus Interesse. Warum geht der Compiler vom Typ aus bzw. kennt das Objekt scheinbar nicht oder wie kann ich dem Compiler das ganze korrekt vermitteln?

Re: [C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 01:07
von BeRsErKeR
Immerhin habe ich eine Möglichkeit gefunden, wie das ganze funktioniert. Allerdings bin ich immer noch stutzig. Die Lösung ist:

Code: Alles auswählen

::foo.something = something_else;
Mich wundert hier nur, dass mit ::foo auch genauso die Klasse foo gemeint sein kann. Das ganze geht auch mit einem namespace drumrum:

Code: Alles auswählen

namespace baz
{
class foo {...};
}

...

baz::foo.something = something_else; // OK
foo.something = something_else; // ERROR C2059

Re: [C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 01:24
von CodingCat
C++0x §3.3.10.1 hat geschrieben:A name can be hidden by an explicit declaration of that same name in a nested declarative region or derived class.
Deshalb wählt er bei unqualifiziertem Bezeichner in der statischen Methode den Typ vor der Variable (die Methode ist der Klasse foo untergeordnet, welche ihr somit näher liegt als der umgebende Namespace).
C++0x §3.3.10.2 hat geschrieben:A class name (9.1) or enumeration name (7.2) can be hidden by the name of a variable, data member, function, or enumerator declared in the same scope.
Deshalb wählt er bei qualifiziertem Bezeichner die Variable vor dem Typ (beide sind durch die Namespace-Qualifizierung gleichgeordnet).

Re: [C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 02:48
von BeRsErKeR
Danke für die Info. Das heißt, das Vorgehen mit vorangestelltem namespace ist der richtige Weg um das hier gewünschte Verhalten zu erzielen?

Re: [C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 08:50
von TGGC
Nein. Sinnvoll waere es solchen Quatsch zu vermeiden. Eine Klasse und Instanz den gleichen Bezeichner zu verpassen hat nur einen Nutzen: unles- und unwartbaren Code zu erzeugen.

Re: [C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 11:05
von dowhilefor
Da stimme ich mit TGGC überein. Wieso sollte man seinen Klassen Namen klein schreiben? Imo bad practice und führt zu den aufgezeigten Problemen.

Re: [C++] Unterscheidung von Typ und Instanz

Verfasst: 25.08.2011, 12:31
von BeRsErKeR
BeRsErKeR hat geschrieben:Das heißt, das Vorgehen mit vorangestelltem namespace ist der richtige Weg um das hier gewünschte Verhalten zu erzielen?
Wie gesagt, dass man sowas nicht machen sollte ist mir bewusst. Mich hat nur interessiert wie das syntaktisch in C++ gelöst werden kann. Mir war vor einigen Monaten nicht einmal bewusst, dass man Instanzen überhaupt so nennen kann wie Typen, bis ich auf der Arbeit dann grausigen Code zu Gesicht bekam...