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

mat*_*ewM 0 c++ arrays pointers function

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

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 
}
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 6

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

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

更新:好的,所以你不能使用vector因为这是功课.

另一种解决方案是在初始化时将阵列的内存清零,然后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]));
Run Code Online (Sandbox Code Playgroud)

而且由于您是从类中的两个位置执行此操作,因此应将此逻辑移到单独的private方法中.

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

  1. "旧"数组(如果存在)不是delete[]d; 这是内存泄漏.
  2. 应该将"旧"数组(如果存在)中的值复制到新数组中; 现在的方式他们只是迷失了.

你应该把它们作为下一步来解决.