Pole stringů/struktur ve třídě – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Pole stringů/struktur ve třídě – C / C++ – Fórum – Programujte.comPole stringů/struktur ve třídě – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Topsy Kretts
~ Anonymní uživatel
1 příspěvek
17. 3. 2012   #1
-
0
-

Zdravím, mám menší problém s třídou "telefoní seznam"

typedef struct contact{
        string jmeno;
        string adresa;
        string telefon;
} contact;
class CPhoneBook {
private:
        contact * kontakt;
        int size;  //počet položek v seznamu
        int max;  // velikost pole kontaktů
public:
....
}


CPhoneBook::CPhoneBook( void ){
        size=0;
        max=1000;
        kontakt = ( contact*) malloc ( max * sizeof ( *kontakt ));
}
bool CPhoneBook::Add( const string & name, const string & address, const string & phone){
        kontakt[size].jmeno=name;
        kontakt[size].adresa=address;
        kontakt[size].telefon=phone;
        size++;
        return true;


program při použití metody .Add spadne, neví někdo, v čem může být problém?zkoušel jsem to i bez struktur a místo toho ve tříde 3 pole stringu, dynamicky alokovaný, ale taky to nešlo :-/

Nahlásit jako SPAM
IP: 90.182.14.–
Reklama
Reklama
meqi+1
Newbie
17. 3. 2012   #2
-
0
-

Ukázka

#include <iostream>

using namespace std;

typedef struct
{
    char* name;
    int age;
} Osoba;

class Pole
{
    int top;
    int max;
    Osoba* osoby;

public:
    Pole(int maxSize) : max(maxSize), top(0)
    {
        osoby = new Osoba[maxSize];
    }
    void add(char* name, int age)
    {
        Osoba* os = new Osoba();
        
        strcpy(os->name, name);
        os->age = age;
        *(osoby + top++) = *os;
    }
};

int main()
{
    Pole p(10);

    p.add("jmeno1", 10);
    p.add("jmeno2", 20);

    return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
meqi+1
Newbie
17. 3. 2012   #3
-
0
-

Jinak něco jde vyřešit líp.. určitě by byla lepší nějaká hotová kolekce, místo vlastního pole (pokud se jedná o takovou knihu)
Udělal jsem ještě na rychlo jeden příklad ve smyslu tý knihy... si z toho můžeš odvodit co máš špatně.. jinak nechápu, proč vlastně používáč C syntax v C++ (třeba ta alokace) 

#include <iostream>
#include <string>

using namespace std;

typedef struct sHuman
{
    string Title;
    string Name;
    string Address;

    sHuman() { }
    sHuman(string title, string name, string address)
    {
        Title = title;
        Name = name;
        Address = address;
    }
} Human;

class Book
{
    Human** m_people;
    int m_capacity;
    int m_current;

public:
    Book(const int capacity) : m_capacity(capacity), m_current(0)
    {
        *m_people = new Human[capacity];
    }

    ~Book()
    {
        clear();
    }

    bool add(Human* human)
    {
        if (m_current < m_capacity)
        {
            *(m_people + m_current++) = human;
            return true;
        }
        return false;
    }

    bool remove(const int index)
    {
        if (m_current >= 0)
        {
            delete *(m_people + index);

            for (int i = index; i < m_current - 1; i++)
                *(m_people + i) = *(m_people + i + 1);

            m_current--;
            return true;
        }
        return false;
    }

    void clear()
    {
        for (int i = 0; i < m_current; i++)
            delete *(m_people + i);

        m_current = 0;
    }

    void outPeople() const
    {
        for (int i = 0; i < m_current; i++)
        {
            Human* h = *(m_people + i);
            cout << "Jmeno: " << h->Title << " " << h->Name << " - " << h->Address << endl;
        }
    }

    int Capacity() const { return m_capacity; }
    int CurrentIndex() const { m_current; }
};

int main()
{
    Book book(2);
    book.add(new Human("Ing","Jan","Praha 1"));
    book.add(new Human("Mgr","Karel","Praha 2"));

    if (!book.add(new Human("Ing","Petr","Praha 3")))
    {
        cout << "Kniha je plna!\n";
    }
    book.remove(0);
    book.add(new Human("Bc", "Lenka", "Praha 4"));

    book.outPeople();
    book.clear();
    book.outPeople();

    return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
zlz
~ Anonymní uživatel
634 příspěvků
17. 3. 2012   #4
-
0
-

string je objekt s vlastním operator=, který se při tom přiřazení vyvolá a protože tam nemáš platný objekt, tak to pochopitelně nefunguje. Na alokaci s vytvořením objektů je v C++ operátor new a new[].

kontakt = new contact[max];

A mimochodem je v C++ taky třeba vector, mrkni na to.

Nahlásit jako SPAM
IP: 213.211.51.–
vitamin+8
Grafoman
17. 3. 2012   #5
-
0
-

Tak ako pise zlz, treba alokovat pomocou new, new[].

Rozdiel medzi new a malloc je hlavne volanie konstruktorov (pri mazani destructorov). malloc nevola knstructor, new vola.

Na prvkovy v telefonnom zozname nebudes potrebovat nahodny pristup, takze bude lepsie pouzit zretazeny zoznam napr: list.

V c++ je struct uplnym datovym typom ako trieda, takze toto je zbytocne:

typedef struct contact{
        string jmeno;
        string adresa;
        string telefon;
} contact;

Rovno moze napisat:

struct contact{
        string jmeno;
        string adresa;
        string telefon;
};
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 96 hostů

Podobná vlákna

Pole struktur — založil Kuba-$

AVR, C a pole struktur — založil DAEW

Velikost pole struktur — založil Redby

Ukazatel na pole struktur — založil gogulux

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý