STL VECTOR Problem



  • Hallo liebe Leute ich habe ein Problem mit einem static template vector.
    Der Compiler meldet mir nämmlich copy-konstruktor nicht erreichbar.
    Hier erstmal der Code von der Header:

    #include <iostream>
    #include <vector>
    #include "mString.h"
    using namespace std;
    
    class user;
    typedef vector<user,allocator<user> >  user_vector;
    
    class user
    {
    public:
    
    	user(SOCKET s, SOCKADDR_IN addre,mString name);
        user();
    	user(user *a);
    	user(user &a);
    
    	bool user::operator<(user &a)
    	{
    		if(id_nr < a.get_id())
    		{
    			return true;
    		}
    		else
    			return false;
    	}
    	bool user::operator==(user &a)
    	{
    		if(id_nr == a.get_id())
    		{
    			return true;
    		}
    		else
    			return false;
    	}
    	user& user::operator=(user &a)
    	{
    
    		user_socket = a.get_socket();
    		addr        = a.get_addr();
    		adresse     = inet_ntoa(addr.sin_addr);
    		name        = get_name();
    		user_status = true;
    		id_nr       = get_id();
    
    		return *this;
    	}
    	user& user::operator=(SOCKET s)
    	{
    		this->user_socket = s;
    		return *this;
    	}
    	user& user::operator=(SOCKADDR_IN addre)
    	{
    
    		addr = addre;
            adresse = inet_ntoa(addr.sin_addr);
    		return *this;
    	}
    	user& user::operator=(mString a)
    	{
    		name = a;
    		return *this;
    	}
    	user& user::operator=(bool status)
    	{
    		user_status = status;
    		return *this;
    	}
    	user& user::operator=(char *adr)
    	{
    		adresse = adr;
    		return *this;
    	}
    
    	bool operator!=(user &a)
    	{
    		if(id_nr != a.get_id())
    		{
    			return true;
    		}
    		else
    			return false;
    	}
    
    	int get_id();
    	SOCKET get_socket();
    	SOCKADDR_IN get_addr();
    	mString get_name();
        mString get_adresse()
    	{
    		return adresse;
    	}
    
    	void set_socket(SOCKET s);
    	void set_addr(SOCKADDR_IN addrs);
    	void set_name(mString a);
        int set_id();
       static user_vector userbuf;
    private:
    
    	static int  total_number;
    
    	SOCKET user_socket;
    	SOCKADDR_IN addr;
    	bool user_status;
    	mString adresse;
    	mString name;
    	int id_nr;
    
    };
    
    user_vector user::userbuf;
    int user::total_number = 0;
    

    Hier die Cpp

    #include <iostream>
    #include <vector>
    #include <WinSock2.h>
    #include "mString.h"
    #include "user.h"
    using namespace std;
    
    user::user()
    {
    	user_status = true;
        id_nr = set_id();
    }
    
    user::user(user &a)
    {
    	user_socket = a.get_socket();
    	addr        = a.get_addr();
    	adresse     = inet_ntoa(addr.sin_addr);
    	name        = a.get_name();
    	user_status = true;
    	id_nr       = a.get_id();
    
    }
    user::user(user *a)
    {
    	user_socket = a->get_socket(); 
        addr        = a->get_addr();
        adresse     = inet_ntoa(addr.sin_addr);
        name        = a->get_name();
        user_status = true;
        id_nr       = a->get_id();	
    }
    user::user(SOCKET s,SOCKADDR_IN addre,mString name)
    {
    	static int id= 0;
    	user_socket = s;
    	addr = addre;
    	adresse = inet_ntoa(addre.sin_addr);
    	this->name = name;
    	user_status = true;
        id_nr = set_id();
        ++total_number;
    }
    
    SOCKADDR_IN user::get_addr()
    {
    	return this->addr;
    }
    
    SOCKET user::get_socket()
    {
    	return this->user_socket;
    }
    
    mString user::get_name()
    {
    
    	return name;
    }
    
    int user::get_id()
    {
    	return this->id_nr;
    }
    
    void user::set_addr(SOCKADDR_IN addrs)
    {
    	addr = addrs;
    	adresse = inet_ntoa(addr.sin_addr);
    }
    int user::set_id()
    {
    	static int id =0;
    	return id++;
    }
    
    void user::set_socket(SOCKET s)
    {
    	user_socket = s;
    }
    
    void user::set_name(mString a)
    {
      name = a;
    }
    
    int function(user a)
    {
    	user user1;
    	user1 = a;
    
    	user::userbuf.push_back(user1);
    	return 0;
    }
    

    die funktion function ist eine dummy function welches den fehler simmuliert.
    Ich hoffe jemand hat eine lösung dafür danke im vorraus
    MFG CF



  • Der benötigte Copy-Konstruktor hat AFAIK die Signatur Typ (const Typ&).

    BTW, niemals using namespace im Header!



  • Oder wie soll der Copy-Constructor aussehen
    und was ist bitte schön AFAIK .



  • Cefour schrieb:

    Oder wie soll der Copy-Constructor aussehen

    Wie bitte? 😕

    Cefour schrieb:

    und was ist bitte schön AFAIK .

    Google: AFAIK 💡



  • Hi ich wollte nur wissen wie der Funktionskopf des Copy Konstructor aussehne soll.

    So ich hab noch mir selber eine versuchs Klasse geschrieben wo das klappt.
    Und ich weiss nicht warum das bei dieser Klasse klappt und bei der anderen nicht. Könnte mir jemand ne antwort darauf geben

    #include <vector>
    #include <iostream>
    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    class versuch;
    typedef vector<versuch,allocator<versuch> > versuchvector;

    class versuch
    {
    public:
    versuch()
    {
    strcpy(name,"Hallo");
    }
    versuch(versuch *a)
    {
    strcpy(name ,a->name);
    }

    ~versuch()
    {
    }
    static versuchvector vvv;
    char name[10];

    };

    versuchvector versuch::vvv;

    int main()
    {

    versuch versuch1;
    versuch::vvv.push_back(versuch1);
    cout<<versuch::vvv[0].name;
    int a;
    cin>>a;
    return 0;
    }
    [/code]



  • .filmor schrieb:

    Der benötigte Copy-Konstruktor hat AFAIK die Signatur Typ (const Typ&).

    Nein, denn siehe Standard 12.8 2 (Auszug)

    A nontemplate constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).



  • Mkay



  • Wo ist das Problem in meiner Klasse?????????
    Und wie seht der Funktionskopf aus um eine für die Vector Datenstruktur eine angmessenen CopyKonstruktor zu übergeben



  • Na toll. ich hatte auch mal so ein ähnliches problem!!!!!
    Habe aber keine Lösung gefunden vielleicht hat ja einer von euch ne lösung



  • Cefour schrieb:

    Wo ist das Problem in meiner Klasse?????????

    Das hat .filmor doch schon in seinem ersten Beitrag geschrieben.

    Und wie seht der Funktionskopf aus um eine für die Vector Datenstruktur eine angmessenen CopyKonstruktor zu übergeben

    Schaffst du es nicht, an der passende Stelle ein const einzufügen?



  • Wenn da ein const notwendig ist, ist der Compiler nicht standardkonform (siehe mein Post).



  • Was ist denn 'allocator<>'? Wenn das die Standard-Allokatorklasse ist, kannst du sie bei der Definition auch weglassen.

    Zweitens: Wozu brauchst du dort den <iostream>-Header?

    Drittens: Pack' die Definition der statischen Elemente lieber in die "user.cpp", sonst bekommst du später Linker-Fehler.

    Viertens: Wie lautet der genaue Wortlaut des Fehlers und in wlecher Zeile tritt er auf?



  • Braunstein schrieb:

    Wenn da ein const notwendig ist, ist der Compiler nicht standardkonform (siehe mein Post).

    Wie kommst du darauf? 20.1.3. erfordert doch IMHO ausdrücklich die Äquivalenz bei einer Erzeugung aus const T.



  • Er erzeugt doch aber garnicht aus const T oder übersehe ich hier was?



  • Braunstein schrieb:

    Er erzeugt doch aber garnicht aus const T oder übersehe ich hier was?

    Der Elementtyp von std::vector muss die Eigenschaft "copyconstructible" erfüllen, und das beinhaltet Konstruierbarkeit aus const T.



  • Ok, jetzt ist alles klar. Ich hab doch glatt übersehen, dass push_back const T& als Argument übernimmt.


Anmelden zum Antworten