我知道如果数组中甚至没有对象,那么仍有一些地址。但我想找到解决方案来检查我们会询问的特定索引下是否有对象。我需要有这样的机制来向多边形添加新的点。但在此之前,我需要知道如果有一个对象,对象的计数器是否应该增长或保持相同的值。也许我应该尝试使用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;
};
答案 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 :(得分:0)
如果您需要检查集合中的值,您最好使用关联容器,例如来自STL的map
或set
。我认为你的代码中没有理由可以很容易地交换它。
答案 2 :(得分:0)
除了Jon的建议,C ++没有掌握,所以你需要在数组中显式维护valiud元素:a)使用max-valid-index或b)使用NULL
值无效条目(最好是两者)
注意:使用NULL
只能用于存储数组中的指针。否则,您将需要具有无效值(例如,Punkt
具有太大/太小的坐标)