constructor problem

Post Reply
Message
Author
Peter

constructor problem

#1 Post by Peter »

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 :) )

User avatar
heinrich
Posts: 219
Joined: 22. Sep 1999 11:22
Location: N49.137 E8.544

Re: constructor problem

#2 Post by heinrich »

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>
It just works.

Peter

Re: constructor problem

#3 Post by Peter »

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 :)

User avatar
arni
Posts: 73
Joined: 10. Feb 2002 19:32
Location: Berlin
Contact:

Re: constructor problem

#4 Post by arni »

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>
Last edited by arni on 11. Feb 2002 2:03, edited 3 times in total.

Peter

Re: constructor problem

#5 Post by Peter »

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

Post Reply