Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Und gleich das nächste Problem... (es ist zum Verzweifeln!)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.09.2006, 21:12 Uhr
Yadgar



High!

Die inline-Geschichte war eher von akademischem Interesse... aber jetzt wird es richtig kriminell: obwohl ich den vector gObjects nur einmal definiert habe bekomme ich ständig die Linker-Fehlermeldung "multiple definition". Die Datei fractint.h, in der gObjects definiert ist, wird sowohl von ihrer Implementationsdatei (fractint.cpp) als auch vom Hauptprogramm inkludiert - die Alternative wäre, die Definition von gObjects in die Implementationsdatei zu verlegen, dann ist gObjects aber im Hauptprogramm nicht mehr bekannt! fractint.cpp auch im Hauptprogramm zu inkludieren führt wiederum zu Mehrfachdefinitionen sämtlicher Klassenmethoden... und im Hauptprogramm kann ich wiederum gObjects nicht definieren, weil es in fractint.cpp wegen diverser Methoden von NamedObjectBase, die es verwenden, schon bekannt sein muss...

Was tun? Alles in eine Datei packen kann ja wohl nicht der Weg sein...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.09.2006, 22:02 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Poste mal die Zeile aus der .h(pp) Datei bitte. Was vielleicht für dich wie eine Deklaration aussieht könnte für den Kompiler ja auch ne Definition sein ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.09.2006, 22:16 Uhr
Yadgar



High!


Zitat von J-jayz-Z:
Poste mal die Zeile aus der .h(pp) Datei bitte.


Voilà:


C++:
// FractInt, eine Klasse für Brüche
// (AUPPERLE, S. 392ff)

#ifndef FRACTINT_H
#define FRACTINT_H

#include "ggt.h"


class NamedObjectBase;

vector<NamedObjectBase*> gObjects;

class NamedFractInt;

//--------------------------------------------------------------------------------
//     FractInt
//
class FractInt
{
  friend int ggT(int aA, int aB);                          // Hilfsfunktion: berechnet größten gemeinsamen Teiler
  private:
    int mZaehler, mNenner;                                 // Zähler und Nenner                              
    mutable bool mValid;                                   // Cache-Implementierung
    mutable double mValue;                                 // Cache-Inhalt
  public:
    FractInt();                                            // Standardkonstruktor
    FractInt(int aZaehler, int aNenner=1);                 // Allgemeiner Konstruktor, Nenner standardmäßig 1
    FractInt(const FractInt& aFI);                         // Kopierkonstruktor
    void print();                                          // Ausgabefunktion
    void setZaehler(int aZaehler);                         // verändert nur den Zähler
    void setNenner(int aNenner);                           // verändert nur den Nenner
    void setValue(int aZaehler, int aNenner);              // verändert Zähler und Nenner
    int getZaehler();                                      // liefert Zähler zurück
    int getNenner();                                       // liefert Nenner zurück
    double calculateValue();                               // berechnet Wert als Fließkommazahl
    bool isValid() const;                                  // prüft, ob Wert des Bruches verändert wurde, falls ja, dann false
    const FractInt operator + (const FractInt aF2) const;  // Addition
    FractInt operator += (FractInt aF2);                    // Addition mit Zuweisung
    FractInt operator - (FractInt aF2);                     // Subtraktion
    FractInt operator -= (FractInt aF2);                    // Subtraktion mit Zuweisung
    FractInt operator * (FractInt aF2);                     // Multiplikation
    FractInt operator *= (FractInt aF2);                    // Multiplikation mit Zuweisung
    FractInt operator / (FractInt aF2);                     // Division
    FractInt operator /= (FractInt aF2);                    // Division mit Zuweisung
    FractInt& operator ++ ();                              // Inkrement-Operator, Präfix
    FractInt operator ++ (int);                            // Inkrement-Operator, Postfix
    operator bool() const;                                 // Wandlungsoperator FractInt -> bool
    operator const char*() const;                          // Wandlungsoperator FractInt -> string
    operator double();                                     // Wandlungsoperator FractInt -> double,
                                                           // verwendet Methode calculateValue
    void shorten(void);                                    // Funktion zum Kürzen
};

//--------------------------------------------------------------------------------
//     NamedObjectBase
//
class NamedObjectBase
{
  protected:
    //--- Name eines Objektes
    //    1. Muss systemweit eindeutig sein
    //    2. Muss mindestens 3, höchstens 128 Zeichen enthalten
    //
    NamedObjectBase(string aName);
    ~NamedObjectBase();
  public:
    //--- liefert den Objektnamen
    //
    string getObjectName() const;
  protected:
    string mName;
};


//--------------------------------------------------------------------------------
//     NamedFractInt
//
class NamedFractInt : public FractInt, public NamedObjectBase
{
  public:
    NamedFractInt(string aName, int aZaehler, int aNenner=1);
    NamedFractInt operator += (int);
    friend NamedFractInt operator + (const NamedFractInt&, const NamedFractInt&);
  private:
};

#endif


--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.09.2006, 08:42 Uhr
ao

(Operator)


Vielleicht so:

Im .h-File:
extern vector<NamedObjectBase*> gObjects;

In genau einem .cpp-File:
vector<NamedObjectBase*> gObjects;

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.09.2006, 18:01 Uhr
Yadgar



High!


Zitat von ao:
Vielleicht so:

Im .h-File:
extern vector<NamedObjectBase*> gObjects;

In genau einem .cpp-File:
vector<NamedObjectBase*> gObjects;

ao


Das funktioniert leider auch nicht - ungekehrt ebenfalls nicht! Da bleibt mir ja wirklich nichts anderes übrig, als alles in eine Datei zu packen - aber das kann doch nicht im Sinne fortgeschrittener C++-Programmierung sein, oder?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 19.09.2006 um 18:05 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.09.2006, 19:02 Uhr
ao

(Operator)


Also, folgendes übersetzt bei mir perfekt:

p1.cpp:

C++:
#include <vector>
std::vector<int> v; // Vektor definieren

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}


An der Signatur von _tmain bitte nicht stören, das ist Microsoft.

p1.h:

C++:
extern std::vector<int> v;  // extern-Deklaration



p2.cpp:

C++:
#include <vector>
#include "p1.h" // extern-Deklaration laden

void p2 ()
{
    v.push_back (123);  // v verwenden
}



Ist denn bei dir die Fehlermeldung noch dieselbe?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.09.2006, 22:26 Uhr
Blubber2063



Öhmm, ändert nix an der Funktionsfähigkeit, aber sinnvoll wäre schon wenn p1, seinen eigenen Header includiert oder ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.09.2006, 22:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von Blubber2063:
Öhmm, ändert nix an der Funktionsfähigkeit, aber sinnvoll wäre schon wenn p1, seinen eigenen Header includiert oder ?

normalerweise ja - wenn da aber nur die extern anweisung drin steht unnötig
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.09.2006, 23:57 Uhr
typecast
aka loddab
(Operator)



Zitat:

Das funktioniert leider auch nicht - ungekehrt ebenfalls nicht! Da bleibt mir ja wirklich nichts anderes übrig, als alles in eine Datei zu packen - aber das kann doch nicht im Sinne fortgeschrittener C++-Programmierung sein, oder?



Ich würde jetzt mal behaupten wollen, dass globale Variablen nicht im Sinne von fortgeschrittener C++-Programmierung sind.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.09.2006, 08:40 Uhr
ao

(Operator)



Zitat von typecast:
Ich würde jetzt mal behaupten wollen, dass globale Variablen nicht im Sinne von fortgeschrittener C++-Programmierung sind.

Das mag sein, aber darum gehts jetzt eigentlich nicht. Wir suchen gerade, welchen Fehler Yadgar gemacht hat und weshalb er sein Programm nicht linken kann.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: