Hi,
ich habe folgendes Probelem:
In meinem Programm gibt es einen Constructor der class Variablenloesung, der einen vector<int> als Parameter nimmt... So, da man, wenn man derartige Klassen als membervariablen nimmt, wohl einen "leer" () Construktor braucht, habe ich folgendes entwickelt:
<code>
Variablenloesung::Variablenloesung()
{
vector<int> tmp(3,0);
Variablenloesung(tmp);
}
</code>
Wie gesagt, Variablenloesung(vector<int>) gibt es.... sollte also grad den anderen construcor aufrufen, klappt aber nicht :
g++ -Wall -ggdb -c variablenloesung.cpp
variablenloesung.cpp: In method `Variablenloesung::Variablenloesung()':
variablenloesung.cpp:15: conflicting types for `class Variablenloesung tmp'
variablenloesung.cpp:14: previous declaration as `class vector<int,allocator<int> > tmp'
make: *** [variablenloesung.o] Error 1
Wer kann mir helfen ? (Bitte nicht erklaeren wie shice doch C++ ist Wolfgang )
constructor problem
Re: constructor problem
so etwas ?
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
/* Erfolgreich Kompiliert unter
Microsoft Windows:
GNU gcc version 2.95.3-5 (cygwin special)
Microsoft 32-Bit C/C++-Compiler Version 12.00.8168 fuer x86
Linux:
GNU gcc version 2.95.3 20010315 (SuSE)
FreeBSD:
GNU gcc version 2.95.3
*/
#include <iostream>
#include <vector>
/*
* eigener namespace fuer Peter's Klasse(n)
*/
namespace Peter {
class Variablenloesung
{
public:
Variablenloesung()
: m_vector( std::vector<int>(3,0) )
{
// nothing to do
};
Variablenloesung( std::vector<int> v )
{
// do something
} ;
~Variablenloesung() { } ;
private:
std::vector<int> m_vector;
};
/*
* oder doch vielleicht eher mit einem Template ?
*/
template<class T>
class Variablenloesung2
{
public:
Variablenloesung2()
: m_vector( std::vector<T>(3,0) )
{
// nothing to do
};
Variablenloesung2( std::vector<int> v )
{
// do something
} ;
~Variablenloesung2() { } ;
private:
std::vector<T> m_vector;
};
} // end: namespace Peter
int main(int argc, char** argv)
{
std::cout << "try to create some instances..." << std::endl;
Peter::Variablenloesung var1;
Peter::Variablenloesung2<int> var2;
Peter::Variablenloesung2<char> var3;
Peter::Variablenloesung2<float> var4;
std::cout << "done." << std::endl;
return 0;
}
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
/* Erfolgreich Kompiliert unter
Microsoft Windows:
GNU gcc version 2.95.3-5 (cygwin special)
Microsoft 32-Bit C/C++-Compiler Version 12.00.8168 fuer x86
Linux:
GNU gcc version 2.95.3 20010315 (SuSE)
FreeBSD:
GNU gcc version 2.95.3
*/
#include <iostream>
#include <vector>
/*
* eigener namespace fuer Peter's Klasse(n)
*/
namespace Peter {
class Variablenloesung
{
public:
Variablenloesung()
: m_vector( std::vector<int>(3,0) )
{
// nothing to do
};
Variablenloesung( std::vector<int> v )
{
// do something
} ;
~Variablenloesung() { } ;
private:
std::vector<int> m_vector;
};
/*
* oder doch vielleicht eher mit einem Template ?
*/
template<class T>
class Variablenloesung2
{
public:
Variablenloesung2()
: m_vector( std::vector<T>(3,0) )
{
// nothing to do
};
Variablenloesung2( std::vector<int> v )
{
// do something
} ;
~Variablenloesung2() { } ;
private:
std::vector<T> m_vector;
};
} // end: namespace Peter
int main(int argc, char** argv)
{
std::cout << "try to create some instances..." << std::endl;
Peter::Variablenloesung var1;
Peter::Variablenloesung2<int> var2;
Peter::Variablenloesung2<char> var3;
Peter::Variablenloesung2<float> var4;
std::cout << "done." << std::endl;
return 0;
}
</font><hr></pre></blockquote>
It just works.
Re: constructor problem
grml, ich raffs net
1. Was ist an meinem Code da oben falsch ??
2. Was bedeutet (In deinem code) :
Variablenloesung()
: m_vector( std::vector<int>(3,0) ) ??
der Einfache : ist doch für vererbung oder ?
denn hab ich bisher nur oben bei classen verwendet (class Quader:Rechteck...)
Peter <-- bittet um Erklaerung
1. Was ist an meinem Code da oben falsch ??
2. Was bedeutet (In deinem code) :
Variablenloesung()
: m_vector( std::vector<int>(3,0) ) ??
der Einfache : ist doch für vererbung oder ?
denn hab ich bisher nur oben bei classen verwendet (class Quader:Rechteck...)
Peter <-- bittet um Erklaerung
Re: constructor problem
Wenn du das Objekt nicht auf dem Heap anlegen willst ("new"), musst Du bei Templates die Initialisierung innerhalb der Konstruktor-Initialisiererliste vornehmen. das ":" leitet diese Liste ein. C++ ist halt eine komische Sprache <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> steht das ":" nach dem Klassennamen bedeutet es "erbt von". Steht das ":" nach dem Methodenkopf des Konstruktors bedeutet es "initialisiere dieses hier".
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
template <class T> class vector
{
public:
vector(int size) { _v = (T*)calloc (size, sizeof(T));_size=size;}
virtual ~vector(){ free(_v);}
T operator[](int i)const { assert (i<_size); return _v<i>; }
T& operator[](int i) { assert (i<_size); return _v<i>; }
private:
T* _v;
int _size;
};
class zahlen
{
public:
zahlen (int size): _v(size) {}
virtual ~zahlen(){}
void set (int idx, int value){ _v[idx]=value;}
int get (int idx){ return _v[idx]; }
private:
vector<int>_v;
};
int main()
{
zahlen z(2);
z.set (0,10);
printf ("%d",z.get(0));
return 0;
}
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
template <class T> class vector
{
public:
vector(int size) { _v = (T*)calloc (size, sizeof(T));_size=size;}
virtual ~vector(){ free(_v);}
T operator[](int i)const { assert (i<_size); return _v<i>; }
T& operator[](int i) { assert (i<_size); return _v<i>; }
private:
T* _v;
int _size;
};
class zahlen
{
public:
zahlen (int size): _v(size) {}
virtual ~zahlen(){}
void set (int idx, int value){ _v[idx]=value;}
int get (int idx){ return _v[idx]; }
private:
vector<int>_v;
};
int main()
{
zahlen z(2);
z.set (0,10);
printf ("%d",z.get(0));
return 0;
}
</font><hr></pre></blockquote>
Last edited by arni on 11. Feb 2002 2:03, edited 3 times in total.
Re: constructor problem
grml
Und warum geht jetzt mein Code nicht ? Ist doch logisch ?? Was auf jeden Fall auch funktioniert, ist
Klasse::Klasse(string)
{
hier steht was;
}
Klasse::Klasse()
{
Klasse("ruf anderen auf");
}
Dass geht, aber wenn ich vorhere nen string mache, und den übergebe, dann gehts nimmer.
Erklaert mal bitte....
Peter
Und warum geht jetzt mein Code nicht ? Ist doch logisch ?? Was auf jeden Fall auch funktioniert, ist
Klasse::Klasse(string)
{
hier steht was;
}
Klasse::Klasse()
{
Klasse("ruf anderen auf");
}
Dass geht, aber wenn ich vorhere nen string mache, und den übergebe, dann gehts nimmer.
Erklaert mal bitte....
Peter