0

我知道如果数组中甚至没有对象,仍然有一些地址。但是我想找到解决方案来检查我们将询问的特定索引下是否有对象。我需要有这样的机制来向多边形添加新点。但在此之前,我需要知道如果有对象,对象的计数器是否应该增长或保持相同的值。也许我应该尝试用 填充所有数组NULL

主文件

#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;
}

维洛卡特.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 
}

维洛卡特.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,因为这是家庭作业。

另一种解决方案是在初始化数组时将其内存清零,然后m_tab[i] == 0在尝试使用 object 之前检查是否i。使用memset,看起来像

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

而且由于您是从类中的两个地方执行此操作,因此您应该将此逻辑移动到一个单独的private方法中。

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

  1. “旧”数组(如果存在)不是delete[]d;这是内存泄漏。
  2. 应将“旧”数组(如果存在)中的值复制到新数组;事情现在的样子,他们只是迷失了。

您应该在下一步修复这些问题。

于 2012-05-15T14:06:48.077 回答
0

如果您需要检查集合中的值,最好使用关联容器,例如来自 STL的 amap或 a 。set我从您的代码中看不出有任何理由可以很容易地交换它。

于 2012-05-15T14:09:26.907 回答
0

除了 Jon 的建议之外,C++ 不会牵着你的手,所以你需要显式维护数组中的有效元素:要么通过 a) 使用 max-valid-index 要么 b) 使用NULL无效条目的值(最好同时使用两者)

注意: usingNULL仅适用于在数组中存储指针。否则,您将需要一个无效值(例如Punkt,坐标太大/太小)

于 2012-05-15T14:11:13.240 回答