не имеет члена с именем c ++

0

У меня есть некоторые проблемы. Я создал программу с динамическим стеком, и когда компилирую get, вы получите: "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
    «На языке C программа в порядке» - а? Я полагаю, вы говорите о другом коде ...
  • 0
    C ++ позволяет вам определять функции-члены, которые вы можете вызывать с использованием синтаксиса, например stos1.push (), но вы не определили их. C ++ не меняет способ вызова функции в стиле C.
Теги:
stack
member
named

7 ответов

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

В коде вы объявляете класс 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 ()
};  

Если вы создадите такой класс, вы можете оставить вызовы функций в своей основной форме, как сейчас.

1

Проблема в том, что "класс stos не имеет имени с именем push" и т.д. push и pop являются функциями-членами. Похоже, вам нужно что-то вроде формы

push (&stos, element); 

а также

pop(&stos1);
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);

Используйте ссылку везде, где можете, указатели, где бы вы ни находились. ;-)

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;
}
  • 0
    Если вы делаете эти функции методами, вы также должны удалить параметр s и вместо этого получить доступ к переменным экземпляра.
  • 0
    @john: Да, отредактировал мой ответ.
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 прежде чем идти дальше

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, но вы только прошли половину пути.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню