0

配列にオブジェクトがない場合でも、アドレスが残っていることを私は知っています。しかし、私たちが尋ねる特定のインデックスの下にオブジェクトがあるかどうかを確認するための解決策を見つけたいと思います。ポリゴンに新しいポイントを追加するには、このようなメカニズムが必要です。しかしその前に、オブジェクトがあった場合にオブジェクトのカウンターが大きくなるか、同じ値にとどまるかを知る必要があります。たぶん私はすべての配列をNULL

main.cpp

#include <iostream>
#include "punkt.h"
#include "wielokat.h"

using namespace std;

int main(int argc, char *argv[])
{
    Punkt  p1("p1", 10, 20); // 10x20
    Punkt  p2("p2", 1, 1);   //1x1

    Wielokat w1 ("square", 4);

    w1.set(p1,0);
    w1.set(p2,0);
    w1.showWielokat();


    system("PAUSE");
    return EXIT_SUCCESS;
}

Wielokat.cpp

#include "punkt.h"
#include "wielokat.h"
#include <iostream>

using namespace std;

void Wielokat::increase(int n)
{
    m_ilosc = m_ilosc + n;
    m_tab = new Punkt * [m_ilosc];  
    cout<<"Dodaj "<<m_ilosc<<endl;
}

void Wielokat::decrease(int n)
{
    m_ilosc = m_ilosc - n;
    if(m_ilosc<0){ m_ilosc=0;}
    m_tab = new Punkt * [m_ilosc]; 
    cout<<"Odejmij "<<m_ilosc<<endl;
}
void Wielokat::set(Punkt p, int pos)
{
    //How to check if there was already object ?
    m_tab[pos] = new Punkt(p);
    m_counter++;
}

void Wielokat::showWielokat()
{
    for(int i=0; i<m_counter; i++){
        m_tab[i]->show();
    }

}
void Wielokat::crash(int pos){
    //after delete all elements moved one by one to the left side
    delete m_tab[pos];
    for(int i=pos; i<m_ilosc; i++){
        m_tab[i]=m_tab[pos+1];
    }
}
double Wielokat::getParimeter(){
    //here is function whih will count circuit 
}

Wielokat.h

class Wielokat {

    public:

    Wielokat(char* nazwa, int ilosc):m_nazwa(nazwa), m_ilosc(ilosc) 
    {
        m_tab = new Punkt * [m_ilosc]; 
        m_counter = 0;
    }

    Wielokat(const Wielokat& p): m_ilosc(p.m_ilosc), m_nazwa(strdup(p.m_nazwa))
    {}

    ~Wielokat()
    {
        for(int i=0; i<m_counter; i++){
            delete m_tab[i];
        }
        delete m_tab;
    }

    //Function:
    void increase(int n);
    void decrease(int n);
    void set(Punkt p, int pos);
    void crash(int pos);  //delete
    void showWielokat();
    double getParimeter();



    private:
    Punkt **m_tab;  //our tab of elemenst
    char* m_nazwa;
    int m_ilosc;
    int m_counter;
};
4

3 に答える 3

6

あなたはC++でコーディングしています。つまり、std::vector<Punkt>(または、std::vector<Punkt*>ポリモーフィズムが必要な場合は、)を持つことができます。車輪の再発明をしないでください。これを使って。

すべての手動割り当てコードを使用std::vectorする必要はなく、で要素がいくつあるかを確認できますvec.size()

更新:vector OK、これは宿題なので使用できません。

別の解決策は、配列を初期化するたびに配列のメモリをゼロにし、m_tab[i] == 0オブジェクトを使用する前に確認することiです。を使用するmemsetと、次のようになります

// WARNING! INCOMPLETE/BUGGY CODE!
m_tab = new Punkt* [m_ilosc];
memset(m_tab, 0, m_ilosc * sizeof(m_tab[0]));

また、クラス内の2つの場所からこれを実行しているため、このロジックを別のprivateメソッド内に移動する必要があります。

不完全/バギー部分に関して、上記の2行にはいくつかの問題があります。

  1. 「古い」配列(存在する場合)はdelete[]dではありません。これはメモリリークです。
  2. 「古い」配列(存在する場合)の値を新しい配列にコピーする必要があります。物事が今のように、それらは単に失われます。

次のステップとしてこれらを修正する必要があります。

于 2012-05-15T14:06:48.077 に答える
0

Jonのアドバイスに加えて、C ++はあなたの手を握らないので、配列内のvaliud要素を明示的に維持する必要があります:a)max-valid-indexを使用するか、b)NULL無効なエントリの値を使用する(できれば両方)

:使用NULLは、配列にポインターを格納する場合にのみ機能します。それ以外の場合は、無効な値が必要になります(たとえば、Punkt座標が大きすぎる/小さすぎる)

于 2012-05-15T14:11:13.240 に答える
0

コレクション内の値をチェックする必要がある場合は、STLのamapやaなどの連想コンテナを使用することをお勧めします。setあなたのコードから、これをかなり簡単に交換できる理由はわかりません。

于 2012-05-15T14:09:26.907 に答える