[C++] Unterscheidung von Typ und Instanz

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[C++] Unterscheidung von Typ und Instanz

Beitrag 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?
Ohne Input kein Output.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

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

Beitrag 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
Ohne Input kein Output.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

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

Beitrag 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).
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

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

Beitrag 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?
Ohne Input kein Output.
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

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

Beitrag 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.
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

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

Beitrag 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.
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

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

Beitrag 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...
Ohne Input kein Output.
Antworten