我有一些问题。我使用动态堆栈创建程序,当我编译获取错误时:'class stos'没有名为'push'的成员,'class stos'没有名为'pop'的成员,'class stos'没有名为'destroy'的成员','class stos'没有名为'isempty'的成员。在语言C程序很好,但在C ++中没有。我用C ++开始冒险,我不知道我做错了什么。你能帮助我吗 ?我正在写一个代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <iostream>
#include <conio.h>
using namespace std;
class stos
{
public:
int *tab;
int licznik;
int rozmiar;
};
void init (class stos* s)
{
s->licznik = 0;
s->rozmiar = 3;
//s->tab = (int*) malloc ( 2 * sizeof * s->tab );
s->tab = (int*) malloc ( s->rozmiar * sizeof(int) );
if (s->tab == NULL)
{
cout << "Blad alokacji pamieci\n";
abort ();
}
}
void push (class stos* s, int element)
{
if (s->licznik != s->rozmiar)
{
cout << "Dodaj element do stosu\n";
cin >> element;
s->tab[s->licznik] = element;
s->licznik++;
}
else
{
s->rozmiar = 2 * (s->rozmiar);
s->tab = (int*) realloc (s->tab, (s->rozmiar) * sizeof (int));
cout << "Zwiekszono pamiec\n";
cout <<"Dodaj element do stosu\n";
cin >> element;
s->tab[s->licznik] = element;
s->licznik++;
}
//system ("clear");
}
int pop (class stos* s)
{
if (s->licznik == 0)
{
cout << "Nie podales zadnego elementu\n";
abort ();
}
else
{
s->licznik--;
}
return s->tab[s->licznik];
}
void destroy (class stos* s)
{
free (s->tab);
}
bool isempty (class stos* s)
{
bool empty = true;
if (s->licznik == 0)
{
empty = true;
cout << "Stos nie posiada zadnych elementow\n";
}
else
{
empty = false;
cout << "Stos zawiera jakies elementy\n";
}
return empty;
}
int main ()
{
int element = 0, a = 0;
stos stos1;
stos stos2;
do
{
cout << "\nMENU\n\n";
cout << "STOS I\nAby dodac element do stosu wcisnij '1'\nAby odjac element ze stosu wcisnij '2'\n";
cout << "Wcisnij '3' aby usunac stos\nWcisnij '4' aby sprawdzic czy stos zawiera elementy\n\n";
cout << "STOS II\nAby dodac element do stosu wcisnij '5'\nAby odjac element ze stosu wcisnij '6'\n";
cout << "Wcisnij '7' aby usunac stos\nWcisnij '8' aby sprawdzic czy stos zawiera elementy\n\n";
cout << "Wcisnij '0' aby zakonczyc dzialanie programu\n\n";
cin >> a;
//system ("clear");
if (a == 1)
{
stos1.push (element);
}
if (a == 2)
{
cout << "Usunieto element:" << stos1.pop;
}
/*if (a == 3)
{
destroy (&stos1);
printf ("Wyczyszczono stos 1\n");
}*/
if (a == 4)
{
stos1.isempty;
}
if (a == 5)
{
stos2.push (element);
}
if (a == 6)
{
cout << "Usunieto element: " << stos2.pop;
}
/*if (a == 7)
{
destroy (&stos2);
printf("Wyczyszczono stos 2\n");
}*/
if (a == 8)
{
stos2.isempty;
}
}
while (a!=0);
destroy (&stos1);
destroy (&stos2);
getch();
return 0;
}
答案 0 :(得分:4)
这是因为函数stos
,push
等是自由函数,但你称之为方法。你需要这样打电话给他们:
stos s;
init(&s)
push(&s, 3)
或者更好的是,您可以将函数转换为方法:
class stos {
public:
stos() // constructor instead of init
{
// access members tab, etc. directly
licznik = 0;
// ...
}
void push(int element)
{
}
// ...
private:
int *tab;
int licznik;
int rozmiar;
};
答案 1 :(得分:1)
问题是“类stos没有名为push的成员”等等。 push
和pop
是非会员功能。看起来你需要一些形式的东西
push (&stos, element);
和
pop(&stos1);
答案 2 :(得分:1)
在您的代码中,您声明了类stos
。该类只包含一些字段。
稍后在您的代码中定义函数
void push (class stos* s, int element)
int pop (class stos* s)
bool isempty (class stos* s)
基本上这是正确的。您可以创建类stos
的实例,然后调用其中一个函数并将stos
实例作为函数的参数传递。在这种情况下,您需要进行如下函数调用:
push (stos1, element);
而不是:
stos1.push (element);
另一种方式是,其他人可能已经建议将功能添加到您的班级。在这种情况下,您的类定义将如下所示:
class stos
{
public:
int *tab;
int licznik;
int rozmiar;
void push (int element)
int pop ()
bool isempty ()
};
如果你创建这样的类,你可以像现在一样将函数调用留在main中。
答案 3 :(得分:0)
如果你想拥有成员函数,你必须编写它们,例如push可以像这样编写
class stos
{
public:
void push (int element);
int *tab;
int licznik;
int rozmiar;
};
void stos::push (int element)
{
if (licznik != rozmiar)
{
cout << "Dodaj element do stosu\n";
cin >> element;
tab[licznik] = element;
licznik++;
}
else
{
rozmiar = 2 * (rozmiar);
tab = (int*) realloc (tab, (rozmiar) * sizeof (int));
cout << "Zwiekszono pamiec\n";
cout <<"Dodaj element do stosu\n";
cin >> element;
tab[licznik] = element;
licznik++;
}
//system ("clear");
}
这看起来像是从C翻译过的代码,但你只走了一半。
答案 4 :(得分:0)
您尝试呼叫的功能不属于课程stos
你可以这样做:
class stos
{
public:
int *tab;
int licznik;
int rozmiar;
void init ();
void push (int element);
int pop ();
void destroy ();
bool isempty ()
};
void stos:: init ()
{
this->licznik = 0;
this->rozmiar = 3;
//this->tab = (int*) malloc ( 2 * sizeof * this->tab );
this->tab = (int*) malloc ( this->rozmiar * sizeof(int) );
if (this->tab == NULL)
{
cout << "Blad alokacji pamieci\n";
abort ();
}
}
void stos:: push (int element)
{
if (this->licznik != this->rozmiar)
{
cout << "Dodaj element do stosu\n";
cin >> element;
this->tab[this->licznik] = element;
this->licznik++;
}
else
{
this->rozmiar = 2 * (this->rozmiar);
this->tab = (int*) realloc (this->tab, (this->rozmiar) * sizeof (int));
cout << "Zwiekszono pamiec\n";
cout <<"Dodaj element do stosu\n";
cin >> element;
this->tab[this->licznik] = element;
this->licznik++;
}
//system ("clear");
}
int stos:: pop ()
{
if (this->licznik == 0)
{
cout << "Nie podales zadnego elementu\n";
abort ();
}
else
{
this->licznik--;
}
return this->tab[this->licznik];
}
void stos:: destroy ()
{
free (this->tab);
}
bool stos:: isempty ()
{
bool empty = true;
if (this->licznik == 0)
{
empty = true;
cout << "Stos nie posiada zadnych elementow\n";
}
else
{
empty = false;
cout << "Stos zawiera jakies elementy\n";
}
return empty;
}
答案 5 :(得分:0)
类stos
没有这些成员函数之一,查看您的代码我认为您有两种可能的解决方案。或者您将其添加到类stos,例如:
class stos
{
public:
int *tab;
int licznik;
int rozmiar;
void init ()
{
s->licznik = 0;
s->rozmiar = 3;
//s->tab = (int*) malloc ( 2 * sizeof * s->tab );
s->tab = (int*) malloc ( s->rozmiar * sizeof(int) );
if (s->tab == NULL)
{
cout << "Blad alokacji pamieci\n";
abort ();
}
}
void push (int element)
{
if (s->licznik != s->rozmiar)
{
cout << "Dodaj element do stosu\n";
cin >> element;
s->tab[s->licznik] = element;
s->licznik++;
}
else
{
s->rozmiar = 2 * (s->rozmiar);
s->tab = (int*) realloc (s->tab, (s->rozmiar) * sizeof (int));
cout << "Zwiekszono pamiec\n";
cout <<"Dodaj element do stosu\n";
cin >> element;
s->tab[s->licznik] = element;
s->licznik++;
}
//system ("clear");
}
...
};
或者你以正确的方式打电话给他们:
push(&stos1, element);
而不是
stos1.push(element);
另一方面,如果您决定不将它们包含在stos
类中,请考虑使用引用而不是指针:
void push (class stos& s, int element);
尽可能使用参考,指向任何地方的指针。; - )
答案 6 :(得分:0)
只是提示“流行”问题:
使它成为类stos的方法:
class stos
{
public:
int *tab;
int licznik;
int rozmiar;
int pop( void );
};
实施方法:
int stos::pop (void )
{
if (licznik == 0)
{
cout << "Nie podales zadnego elementu\n";
abort ();
}
else
{
licznik--;
}
return tab[licznik];
}
但在进一步了解之前,你应该真正了解class