Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Container mit Pointern umwandeln in Container mit Const-Pointern

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 <
000
19.03.2007, 14:54 Uhr
Soto



Ein Container mit Pointern auf Objekte soll mal so übergeben werden, dass die Objekte über die Pointer verändert werden können, und mal so, dass sie es nicht können. Gibts da ne gute Möglichkeit oder bin ich überhaupt auf dem Holzweg wenn ich das machen will?
--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.03.2007, 14:57 Uhr
0xdeadbeef
Gott
(Operator)


Übergib den Container mal const und mal nicht const.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.03.2007, 14:59 Uhr
Soto




Zitat von 0xdeadbeef:
Übergib den Container mal const und mal nicht const.


Aber wenn der Container const ist, sind es ja die Pointer im Container deswegen noch lang nicht oder versteh ich das falsch?
--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.03.2007, 15:39 Uhr
0xdeadbeef
Gott
(Operator)


Wenn der Container const ist, gibt er das, was er containt, nur const heraus.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.03.2007, 15:53 Uhr
Soto



Ok, ich muss zugeben dass ich jetzt verwirrt bin...

Vielleicht mal ein Beispielcode zur Illustration. Hier wird ein Vektor mit double-Zeigern initialisiert und dann über eine Methode namens change der Wert, auf den einer dieser Zeiger deutet, verändert.
Bei mir klappt das problemlos...


C++:
#include <iostream>
#include <vector>


void change(const std::vector<double*>& v) {
  **(v.begin()) = 2.0;
}


int main() {

  std::vector<double*> v;

  v.push_back(new double (4.0));

  std::cout << **(v.begin()) << "\n";
  change(v);
  std::cout << **(v.begin()) << "\n";
  

  return 0;
}

--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.03.2007, 17:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Also um die Problematik näher zu verstehen, musst Du unterscheiden zwischen:

C++:
1, const double *p
2. double const *p
3. double * const p
4. double const * const p



(1) is synonym zu (2) und bedeutet: p kann verändert werden, der Inhalt von p jedoch nicht:

C++:
double q = 3.141;
p = &q;  //OK
*p = 3.14; // Illegal


(3) bedeutet, p kann nicht verändert werden, der Inhalte von p schon:

C++:
double q = 3.141;
p = &q;  //Illegal
*p = 3.14; // OK


(4) bedeutet, p kann nicht verändert werden, der Inhalte von p auch nicht:

C++:
double q = 3.141;
p = &q;  //Illegal
*p = 3.14; // Illegal



ein

C++:
void f(const std::vector<double*>& vp) {
...
}


Erzeugt dir einen Vektor, dessen Elemente vom typ (1) bzw. (2) sind.

Was Du willst,m ist ein Vektor mit Elementen vom typ (3) bzw. (4). Das bekommst Du eigentlich nur mit Proxies hin.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.03.2007, 17:18 Uhr
Soto



Ok vielen Dank für die Einführung dieser Schreibweise, damit kann ich besser ausdrücken, was denn mein Ziel ist!
Ich will nämlich durchaus einen Vektor mit Elementen vom Typ (1) bzw. (2).

Ich hätte gedacht, dass mein Beispielprogramm zeigt, dass:


C++:
void f(const std::vector<double*>& vp) {
...
}


einen Vektor erzeugt, dessen Elemente vom Typ (3), aber nicht von (1) oder (2) sind.

In meinem Beispielprogramm nämlich können über die Pointer, die in dem Vektor gespeichert sind, die dahinterliegenden Objekte manipuliert werden.
Es sei denn, ich habe was falsch verstanden?
--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.03.2007, 09:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich weiß nicht, ob Du was falsch verstanden hast. mit einen const vector kannst Du zwar nicht die Pointer verändern, wohl aber das, worauf sie zeigen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.03.2007, 13:12 Uhr
stephanw
localhorst


Genau. Deswegen reicht es eben nicht, den Vector als konstant zu übergeben.

C++:
struct Foo
{
  void doit(); // nicht "const" und verändert das Objekt
};

void f( const std::vector<Foo*>& vec )
{
  vec[0] = new Foo; // geht nicht
  vec.front()->doit(); // geht
}



Du könntest den Container, der die konstanten Objekte enthalten soll, auch so definieren, also einen std::vector<const Foo*> .

Dann müsste es jedoch zu der Funktion, der Du diesen Vector übergibst, eine entsprechende Überladung existieren.

Also:

C++:
void f( const std::vector<Foo*>& vec ); // Objekte können verändert werden
void f( const std::vector<const Foo*>& vec ); // Objekte bleiben konstant


--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: