如何检查对象是否在数组中?

时间:2012-05-15 14:05:17

标签: c++ arrays function pointers

我知道如果数组中甚至没有对象,那么仍有一些地址。但我想找到解决方案来检查我们会询问的特定索引下是否有对象。我需要有这样的机制来向多边形添加新的点。但在此之前,我需要知道如果有一个对象,对象的计数器是否应该增长或保持相同的值。也许我应该尝试使用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;
};

3 个答案:

答案 0 :(得分:6)

您正在使用C ++进行编码,这意味着如果需要多态,您可以拥有std::vector<Punkt>(或std::vector<Punkt*>。不要重新发明轮子;用它。

使用std::vector根本不需要所有手动分配代码,您可以使用vec.size()检查有多少元素。

更新确定,因此您无法使用vector,因为这是作业。

另一种解决方案是在初始化数组时将数组的内存清零,然后在尝试使用对象m_tab[i] == 0之前检查i是否为// WARNING! INCOMPLETE/BUGGY CODE! m_tab = new Punkt* [m_ilosc]; memset(m_tab, 0, m_ilosc * sizeof(m_tab[0])); 。使用memset,看起来像

private

由于您是从类中的两个位置执行此操作,因此应将此逻辑移到单独的delete[]方法中。

关于不完整/错误的部分,上面这两行有一些问题:

  1. “旧”数组(如果存在)不是{{1}} d;这是内存泄漏。
  2. 应将“旧”数组(如果存在)中的值复制到新数组中;现在的情况就是他们丢失了。
  3. 您应该将这些作为下一步修复。

答案 1 :(得分:0)

如果您需要检查集合中的值,您最好使用关联容器,例如来自STL的mapset。我认为你的代码中没有理由可以很容易地交换它。

答案 2 :(得分:0)

除了Jon的建议,C ++没有掌握,所以你需要在数组中显式维护valiud元素:a)使用max-valid-index或b)使用NULL值无效条目(最好是两者)

注意:使用NULL只能用于存储数组中的指针。否则,您将需要具有无效值(例如,Punkt具有太大/太小的坐标)