 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Gilbert Mirenque Guest
|
Posted: Thu Nov 16, 2006 10:30 pm Post subject: verstehe "invalid conversion"-error nicht |
|
|
Hallo NG,
bin ein blutiger Anfänger in C++. Bin eigentlich Java-Programmierer.
Habe da folgendes Problem. Ich habe mir eine Buffer-Klasse geschrieben:
Buffer.h:
class Buffer
{
private:
int BUFFER_SIZE;
public:
Buffer(int size);
char *buffer;
void free();
friend class File;
};
Buffer.cc
#include "Buffer.h"
Buffer::Buffer(int size){
if(size < 1){
throw new Exception(Exception::WrongBufferException);//Exception ist
auch eine eigene Klasse die hier keine Rolle spielt
}
BUFFER_SIZE = size;
buffer = malloc (BUFFER_SIZE);
}
Buffer::~Buffer(){
free(buffer);
}
void Buffer::free(){
free(buffer);
BUFFER_SIZE = 0;
}
später dann folgender Aufruf:
#define BUFFER_SIZE 1024
....
Buffer buffer = new Buffer(BUFFER_SIZE);
dabei erhalte ich folgenden Fehler:
rcopy.cc:27: error: invalid conversion from `Buffer*' to `int'
rcopy.cc:27: error: initializing argument 1 of `Buffer::Buffer(int)'
ich kann den Fehler nicht nachvollziehen. Er sagt doch aus, dass das
erste Argument vom Konstruktor ihn verursacht. BUFFER_SIZE ist doch aber
vom Typ int. Was mache ich falsch?
MfG
G.M. |
|
| Back to top |
|
 |
Gilbert Mirenque Guest
|
Posted: Thu Nov 16, 2006 10:49 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
| Quote: | #define BUFFER_SIZE 1024
...
Buffer buffer = new Buffer(BUFFER_SIZE);
^^^^^^ wollte nur sagen, dass das Zeile 27 ist |
Gruß |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Thu Nov 16, 2006 11:01 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Gilbert Mirenque <formatzeh (AT) gmx (DOT) de> writes:
| Quote: | bin ein blutiger Anfänger in C++. Bin eigentlich Java-Programmierer.
Habe da folgendes Problem. Ich habe mir eine Buffer-Klasse
geschrieben:
Buffer.h:
class Buffer
{
private:
int BUFFER_SIZE;
|
Namen mit ausschliesslich Grossbuchstaben werden üblicherweise nur für
Makros verwendet.
| Quote: | public:
Buffer(int size);
char *buffer;
|
Public data members sind in aller Regel eine sehr schlechte Idee.
| Quote: | void free();
friend class File;
};
Buffer.cc
#include "Buffer.h"
Buffer::Buffer(int size){
if(size < 1){
throw new Exception(Exception::WrongBufferException);//Exception ist
auch eine eigene Klasse die hier keine Rolle spielt
}
BUFFER_SIZE = size;
buffer = malloc (BUFFER_SIZE);
}
Buffer::~Buffer(){
free(buffer);
}
void Buffer::free(){
free(buffer);
BUFFER_SIZE = 0;
}
später dann folgender Aufruf:
|
Bitte poste immer ein komplettes, aber minimales Programm, damit Deine
Leserschaft nicht raten muss, sondern mit copy&paste&compile sehen
kann, was Du siehst.
| Quote: | #define BUFFER_SIZE 1024
|
Das wäre also jetzt der Makro. Den gleichen Namen für einen Makro und
für etwas anderes zu verwenden ist eine ganz schlechte Idee.
Warum ist das nicht einfach eine Variable oder Konstante?
| Quote: | ...
Buffer buffer = new Buffer(BUFFER_SIZE);
dabei erhalte ich folgenden Fehler:
rcopy.cc:27: error: invalid conversion from `Buffer*' to `int'
rcopy.cc:27: error: initializing argument 1 of `Buffer::Buffer(int)'
|
Die Fehlermeldungen sind etwas verwirrlich.
Aber Dein Code versucht ein Objekt vom Typ Buffer mit einem Wert vom
Typ Buffer * zu initialisieren. Da die Klasse Buffer dafür keine
Umwandlung zur Verfügung stellt, ist das nicht möglich. |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Nov 16, 2006 11:10 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Gilbert Mirenque wrote:
| Quote: | Hallo NG,
bin ein blutiger Anfänger in C++. Bin eigentlich Java-Programmierer.
Habe da folgendes Problem. Ich habe mir eine Buffer-Klasse geschrieben:
|
Ich mache mal ein paar zurätzliche Anmerkungen zu Dingen, die mir so
auffallen.
| Quote: |
Buffer.h:
class Buffer
{
private:
int BUFFER_SIZE;
|
Namen, die nur aus Großbuchstaben bestehen, reserviert man am besten für
Makros. Außerdem wäre std::size_t ein besserer Typ.
| Quote: | public:
Buffer(int size);
|
Besser:
explicit Buffer(int size);
andernfalls wird dieser Konstruktor vom Compiler als Konvertierkonstruktor
verwendet.
Warum ist der Zeiger public?
| Quote: | void free();
friend class File;
};
Buffer.cc
#include "Buffer.h"
Buffer::Buffer(int size){
if(size < 1){
throw new Exception(Exception::WrongBufferException);//Exception ist
auch eine eigene Klasse die hier keine Rolle spielt
|
Warum ist WrongBufferException nicht einfach eine von Exception abgeleitete
Klasse?
| Quote: | }
BUFFER_SIZE = size;
buffer = malloc (BUFFER_SIZE);
}
Buffer::~Buffer(){
free(buffer);
}
|
Wo ist die Deklaration zu diesem Destruktor? Außerdem brauchst du, wenn du
einen Destruktor, Kopierkonstruktor oder Zuweisungsoperator brauchst, mit
ziemlicher Sicherheit alle drei.
Alternativ kannst du statt manueller Speicherverwaltung auch einfach einen
std::vector nehmen.
| Quote: | void Buffer::free(){
free(buffer);
BUFFER_SIZE = 0;
}
später dann folgender Aufruf:
#define BUFFER_SIZE 1024
|
Das sorgt dafür, das JEDES weitere Vorkommen von BUFFER_SIZE in der
aktuellen Übersetzungseinheit durch 1024 ersetzt wird. Wenn du dieses
#define beispielsweise vor dem #include "Buffer.h" einsetzt, wird auch in
diesem Header der Name BUFFER_SIZE durch 1024 ersetzt. Das zeigt
einerseits, warum man die Namen, die ausschließlich aus Großbuchstaben
besten, für nichts anderes als Makros einsetzen sollte. Andererseits zeigt
es auch, dass man am besten auf Makros ganz verzichtet, wenn man sie nicht
braucht. Hier wäre besser:
const size_t buffer_size = 1024;
| Quote: | ...
Buffer buffer = new Buffer(BUFFER_SIZE);
dabei erhalte ich folgenden Fehler:
rcopy.cc:27: error: invalid conversion from `Buffer*' to `int'
rcopy.cc:27: error: initializing argument 1 of `Buffer::Buffer(int)'
ich kann den Fehler nicht nachvollziehen. Er sagt doch aus, dass das
erste Argument vom Konstruktor ihn verursacht.
|
Nein.
| Quote: | BUFFER_SIZE ist doch aber vom Typ int. Was mache ich falsch?
|
new gibt einen Zeiger auf einen Buffer zurück. Da du aber buffer nicht als
Zeiger auf Buffer definiert hast, sondern als Buffer selbst, versucht der
Compiler eine Konvertierung. Der einzige Konvertierkonstruktor, den er
findet, ist dein Konstruktor, der einen int als Parameter annimmt. Daher
versucht er, den von new zurückgegebenen Zeiger in einen int zu
konvertieren, was aber nicht klappt. Die Zeile muss heißen:
Buffer* buffer = new Buffer(BUFFER_SIZE);
aber zunächst solltest du dich fragen, ob du das Objekt wirklich dynamisch
mit new erzeugen musst. Wenn nicht, wäre besser:
Buffer buffer(BUFFER_SIZE); |
|
| Back to top |
|
 |
Stefan Suffa Guest
|
Posted: Thu Nov 16, 2006 11:26 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Hallo Gilbert,
| Quote: | Buffer buffer = new Buffer(BUFFER_SIZE);
|
ist die problematische Zeile ...
rechts vom ' = ' entsteht durch new ein Buffer* .... links vom steht
aber bei Dir Buffer buffer und nicht !! Buffer* buffer !!
Versuch es also mal mit:
Buffer* buffer = new Buffer(BUFFER_SIZE);
und selbstverständlich später dann nicht den
delete(buffer)
vergessen !
Ich würde allerdings versuchen die Raw-Pointer (Buffer*) zu vermeiden
und stattdessen folgende Zeile einsetzen (wenn möglich!)
Buffer buffer(BUFFER_SIZE)
das erspart Dir dann später das delete !
Wenn das nicht möglich sein sollte, dann würde ich mir mal den
Autopointer der STL ansehen ... mit dem das ganze so aussehen würde.
std::auto_ptr < Buffer > pBuffer;
pBuffer = std::auto_ptr < Buffer >(new Buffer(BUFFER_SIZE));
Auch hier brauchst Du für das Zerstören des Objektes nicht selbst zu
sorgen, sondern das Objekt wird vom auto_ptr zum Ende des Lebenszyklus
automatisch gelöscht (Schöne Grüße an die Java-Vergangenheit )
Das allerdings nur als Tip am Rande ...
Gruß,
Stefan
Gilbert Mirenque schrieb:
| Quote: | Hallo NG,
bin ein blutiger Anfänger in C++. Bin eigentlich Java-Programmierer.
Habe da folgendes Problem. Ich habe mir eine Buffer-Klasse geschrieben:
Buffer.h:
class Buffer
{
private:
int BUFFER_SIZE;
public:
Buffer(int size);
char *buffer;
void free();
friend class File;
};
Buffer.cc
#include "Buffer.h"
Buffer::Buffer(int size){
if(size < 1){
throw new Exception(Exception::WrongBufferException);//Exception ist
auch eine eigene Klasse die hier keine Rolle spielt
}
BUFFER_SIZE = size;
buffer = malloc (BUFFER_SIZE);
}
Buffer::~Buffer(){
free(buffer);
}
void Buffer::free(){
free(buffer);
BUFFER_SIZE = 0;
}
später dann folgender Aufruf:
#define BUFFER_SIZE 1024
....
Buffer buffer = new Buffer(BUFFER_SIZE);
dabei erhalte ich folgenden Fehler:
rcopy.cc:27: error: invalid conversion from `Buffer*' to `int'
rcopy.cc:27: error: initializing argument 1 of `Buffer::Buffer(int)'
ich kann den Fehler nicht nachvollziehen. Er sagt doch aus, dass das
erste Argument vom Konstruktor ihn verursacht. BUFFER_SIZE ist doch aber
vom Typ int. Was mache ich falsch?
MfG
G.M. |
|
|
| Back to top |
|
 |
Gilbert Mirenque Guest
|
Posted: Thu Nov 16, 2006 11:28 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
OK...das mit den Bezeichnern war wirklich schlecht. Konnte das Problem
jetzt mit Hilfe eines Forums lösen. Von Java her kenne ich, dass man ein
Objekt mit dem new-Operator instanziiert. Jetzt weiß ich, dass man das
in C++ auch machen kann, man aber dadurch immer einen Pointer erhält.
Jetzt konnte ich mein Problem lösen, indem ich mir die Instanz wie folgt
anlege:
Buffer buffer (size);
Gruß
G.M. |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Thu Nov 16, 2006 11:31 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Gilbert Mirenque wrote:
| Quote: | class Buffer
{
private:
int BUFFER_SIZE;
|
Namen in Großbuchstaben sollte man für Makros, bestenfalls noch für
Konstanten reservieren.
| Quote: | public:
Buffer(int size);
char *buffer;
|
Soll der Member 'buffer' wirklich public sein?
| Quote: | void free();
friend class File;
};
Buffer::~Buffer(){
free(buffer);
}
|
Das muss sicherlich "::free(buffer)" heißen. Sollte dir eigentlich der
Compiler verraten. Ansonsten, falls du keine Interoperabilität mit
C-Code brauchst, sollte es natürlich 'delete[] buffer' heißen, bei
'malloc' entsprechend 'new char[...]'.
| Quote: | #define BUFFER_SIZE 1024
...
Buffer buffer = new Buffer(BUFFER_SIZE);
dabei erhalte ich folgenden Fehler:
rcopy.cc:27: error: invalid conversion from `Buffer*' to `int'
rcopy.cc:27: error: initializing argument 1 of `Buffer::Buffer(int)'
|
Entweder 'Buffer* buffer = new Buffer(...)' (Instanziierung als Objekt
auf dem Heap, wie in Java), oder 'Buffer buffer(...)' (Instanziierung
als Objekt auf dem Stack, das automatisch beim Verlassen des
Gültigkeitsbereichs ablebt.
| Quote: | ich kann den Fehler nicht nachvollziehen. Er sagt doch aus, dass das
erste Argument vom Konstruktor ihn verursacht. BUFFER_SIZE ist doch aber
vom Typ int. Was mache ich falsch?
|
Nein. Du gibst ihm ein Objekt vom Typ 'Buffer*' (das Ergebnis von 'new
Buffer'), möchtest aber ein Objekt vom Typ 'Buffer' haben. Also sucht
der Compiler nach einem Konstruktor, der aus einem 'Buffer*' ein
'Buffer' machen kann. Es gibt nur einen Konstruktor, der aber ein 'int'
möchte. Also versucht er, den 'Buffer*', den du hast, in einen 'int' zu
konvertieren, was natürlich nicht geht.
Stefan |
|
| Back to top |
|
 |
Christoph Kliemt Guest
|
Posted: Thu Nov 16, 2006 11:36 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Gilbert Mirenque <formatzeh (AT) gmx (DOT) de> writes:
| Quote: | Hallo NG, bin ein blutiger Anfänger in C++. Bin eigentlich
Java-Programmierer. Habe da folgendes Problem. Ich habe mir eine
Buffer-Klasse geschrieben:
Buffer.h:
class Buffer { private:
int BUFFER_SIZE;
public:
Buffer(int size);
char *buffer;
void free();
friend class File;
};
|
Hmm... grad als Anfänger würde ich solche Sachen lassen. Was Du da
machst ist C in C++ Dekoration.
Im Zweifelsfall die stl verwenden, imho:
Vorschlag / als Anregung (ist jetzt nicht durch den Compiler gelaufen):
#include <vector>
typedef std::vector<char> BufferType;
typedef BufferType::iterator BufferIterator;
class Buffer
{
private:
_buffer; // std::vector raeumt selber hinterher auf.
public:
Buffer( BufferType::size_type size ) :
_buffer( size )
{};
inline BufferIterator begin() { return _buffer.begin(); };
inline BufferIterator end() { return _buffer.end(); };
// add some methods here...
};
hth,
Christoph |
|
| Back to top |
|
 |
Christoph Kliemt Guest
|
Posted: Thu Nov 16, 2006 11:41 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Stefan Suffa <suffa (AT) schneckenheim (DOT) de> writes:
[...]
| Quote: | Wenn das nicht möglich sein sollte, dann würde ich mir mal den
Autopointer der STL ansehen ... mit dem das ganze so aussehen würde.
std::auto_ptr < Buffer > pBuffer; pBuffer = std::auto_ptr < Buffer
(new Buffer(BUFFER_SIZE));
Auch hier brauchst Du für das Zerstören des Objektes nicht selbst zu
sorgen, sondern das Objekt wird vom auto_ptr zum Ende des Lebenszyklus
automatisch gelöscht (Schöne Grüße an die Java-Vergangenheit )
|
Wenn, dann richtig:
http://www.boost.org/libs/smart_ptr/shared_ptr.htm
Das ist dann "fast schon java", und soll wohl im nächtstem Standard
drin sein.
| Quote: | Das allerdings nur als Tip am Rande ...
|
Jepp.
Gruss Christoph |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Fri Nov 17, 2006 12:35 am Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Rolf Magnus schrieb:
| Quote: | Namen, die nur aus Großbuchstaben bestehen, reserviert man am besten für
Makros.
|
Echt? Wo steht das? Ich benutze die immer für Konstanten.
Wer benutzt den noch Makros in C++? Deinen Scott Meyers nicht gelesen?  |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Nov 17, 2006 3:37 am Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Thomas Thiele wrote:
| Quote: | Rolf Magnus schrieb:
Namen, die nur aus Großbuchstaben bestehen, reserviert man am besten für
Makros.
Echt? Wo steht das?
|
Ist einfach nur gängige Konvention.
| Quote: | Ich benutze die immer für Konstanten.
|
Halte ich für ungünstig.
| Quote: | Wer benutzt den noch Makros in C++?
|
Ich benutze sie zumindest in jedem Header als Include-Guards. Aber oft
kommen auch jede Menge davon durch Header von irgendwelchen Bibliotheken
rein.
| Quote: | Deinen Scott Meyers nicht gelesen?
|
Du wirst staunen, aber ich hab gar keinen. |
|
| Back to top |
|
 |
Ole Hinz Guest
|
Posted: Fri Nov 17, 2006 10:12 am Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Hallo,
Thomas Thiele wrote:
| Quote: | Deinen Scott Meyers nicht gelesen?
|
Sollte man eigentlich die englische Ausgabe nehmen oder ist die deutsche
Übersetzung auch brauchbar?
Vielen Dank,
Ole Hinz |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Fri Nov 17, 2006 5:09 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Thomas Thiele wrote:
| Quote: | Wer benutzt den noch Makros in C++?
|
Wie kriegst du amsonsten __LINE__ und __FILE__ implizit in
dienem Log, ohne dass der Benutzer die selben tippen muss? Wie
wandelst du einen Ausdruck zu einer Zeichenkette?
Man soll freilich Makros vermeiden, wenn es andere Möglichkeiten
gibt. Es gibt aber noch ein Paar Dinge, die man nur mit Makros
machen kann.
Da Makros aber nicht die normallen Scope-Regeln anhalten, will
man, dass sie besonders aussehen, und dass sie auch von allen
anderen Symbolen sichtbar unterscheiden. Die gängigste
Konvention dafür ist wohl, Makros nur mit Großbuchstaben zu
schreiben, und Namen mit nur Großbuchstaben in allen anderen
Fällen zu vermeiden.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Sat Nov 18, 2006 7:04 pm Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Christoph Kliemt <news (AT) pgxml (DOT) net> wrote:
| Quote: | typedef std::vector<char> BufferType;
typedef BufferType::iterator BufferIterator;
class Buffer
{
private:
_buffer; // std::vector raeumt selber hinterher auf.
public:
Buffer( BufferType::size_type size ) :
_buffer( size )
{};
inline BufferIterator begin() { return _buffer.begin(); };
inline BufferIterator end() { return _buffer.end(); };
|
Und wenn wir schon beim Schoenmachen sind: das Semikolon ist da
ueberfluessig, und dem Konstruktor koennte man ein 'explicit'
spendieren.
Andre' |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Mon Nov 20, 2006 3:29 am Post subject: Re: verstehe "invalid conversion"-error nicht |
|
|
Ole Hinz schrieb:
| Quote: | Deinen Scott Meyers nicht gelesen? ;-)
Sollte man eigentlich die englische Ausgabe nehmen oder ist die deutsche
Übersetzung auch brauchbar?
|
Ich habe beide deutschen Bände. Habe aber mal in der englischen
geschmökert. Fazit: die deutsche ist brauchbar, die englische etwas besser. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|