Идентификатор не найден - ошибка C3861 в Visual Studio 2019 - PullRequest
0 голосов
/ 26 марта 2020

У меня проблема с моим кодом. К сожалению, при компиляции я постоянно получаю эти ошибки. Чем это может быть вызвано и как это исправить?

ошибка C3861: «печать»: идентификатор не найден

Мой код:

main. cpp

#include "pojazdy.h"
#include <iostream>

using namespace std;

int main()
{
    Pojazdy** poj;
    int size{ 0 }, index{ 0 };
    Petla(poj, size);

    print(poj, size);

    wyrejestruj(poj,size,0);
    print(poj, size);
    wyrejestruj(poj,size);

    return 0;
}

pojazdy.h

#ifndef pojazdy_h
#define pojazdy_h

#include <iostream>
#include <cstdlib>

using namespace std;

class Pojazdy
{
public:
    string typ;
    string marka;
    string model;
    string z_dod;
    int ilosc;
    int cena;

    void dodaj();
    void d_pojazd(Pojazdy**& pojazdy, int& size);
    void wyrejestruj(Pojazdy**& pojazdy, int& size, int index);
    void print(Pojazdy** pojazdy, int size);
    void Petla(Pojazdy**& p, int& size);

    //void wyswietl();
    int get_ilosc() { return ilosc; }
    string get_typ() { return typ; }
    string get_marka() { return marka; }
    string get_model() { return model; }
    int get_cena() { return cena; }
    void set_ilosc(int x);
};

#endif

pojazdy. cpp

#include "pojazdy.h"

#include <iostream>

using namespace std;

void Pojazdy::set_ilosc(int x) { ilosc = x; }

void Pojazdy::dodaj()
{
    cout << "DODAWANIE POJAZDU..." << endl;
    cout << "Podaj typ pojazdu:";
    cin >> typ;

    cout << "Podaj marke pojazdu: ";
    cin >> marka;

    cout << "Podaj model pojazdu: ";
    cin >> model;

    cout << "Dodaj cene pojazdu: ";
    cin >> cena;
}

void Petla(Pojazdy**& p, int& size) {
    char z_dod;// = 'N';
    do {
        d_pojazd(p, size); //odpowiada za dodawnie
        p[size - 1]->dodaj();
        cout << "Czy chcesz zakonczyc dodawanie? Jesli tak, wcisnij Y/N: ";
        cin >> z_dod;

    } while (z_dod == 'N' || z_dod == 'n');//while (p[size]->z_dod == "N" ||p[size]->z_dod == "n");
}

void print(Pojazdy** pojazdy, int size) {
    std::cout << "====================================" << std::endl;
    for (int i{ 0 }; i < size; i++)
        std::cout << "Typ: " << pojazdy[i]->get_typ() << " Marka: " << pojazdy[i]->get_marka() << " Model: " << pojazdy[i]->get_model() << " Cena: " << pojazdy[i]->get_model() << std::endl;
}

void wyrejestruj(Pojazdy**& pojazdy, int& size) {
    for (size_t i{ 0 }; i < size; i++)
        delete pojazdy[i];
    delete[] pojazdy;
    size = 0;
    pojazdy = NULL;
}

void wyrejestruj(Pojazdy**& pojazdy, int& size, int index) {
    if (index < size) {
        Pojazdy** temp = new Pojazdy * [size - 1];
        short int j{ -1 };
        for (size_t i{ 0 }; i < size; i++) {
            if (i != index) {
                j++;
                temp[j] = pojazdy[i];
            }
        }
        delete[] pojazdy;
        --size;
        pojazdy = temp;
    }
    else
        std::cout << "Pamiec zwolniona!" << std::endl;
}

void d_pojazd(Pojazdy**& pojazdy, int& size) {
    Pojazdy** temp = new Pojazdy * [size + 1];
    if (size == 0)
        temp[size] = new Pojazdy;
    else {
        for (int i{ 0 }; i < size; i++)
            temp[i] = pojazdy[i];
        delete[] pojazdy;

        temp[size] = new Pojazdy;
    }
    ++size;
    pojazdy = temp;
}

Я использовал #ifndef, #define, #endif и #pragma once, но ни один из них не работает. Я буду очень благодарен за каждый код, я уже устал от этого второго часа. И простите не-Engli sh переменные и имена функций для них - это университетский код, поэтому я не чувствовал необходимости.

Ответы [ 4 ]

1 голос
/ 26 марта 2020

Вы объявили нестандартную c функцию-член print в определении класса

class Pojazdy
{
public:
    // ...
    void print(Pojazdy** pojazdy, int size);
    //...

, но пытаетесь вызвать ее как отдельную функцию в main

print(poj, size);

Таким образом, компилятор выдает ошибку.

Объявление функции как отдельной функции, которая в то же время является ее определением в файле pojazdy.cpp, не отображается в модуле вместе с главным, потому что этот модуль включает только заголовок с объявлением класса.

Вы должны решить, должна ли эта функция быть функцией-членом класса или автономной функцией.

1 голос
/ 26 марта 2020

Переместите функции ниже за пределы объявления класса.

void wyrejestruj(Pojazdy**& pojazdy, int& size, int index);
void print(Pojazdy** pojazdy, int size);
void Petla(Pojazdy**& p, int& size);

Или сделайте их stati c и вызывайте как Pojazdy::print(poj, size);.

0 голосов
/ 26 марта 2020

Вы поместили свои прототипы функций в неправильное место. Они должны быть после декалирования класса.

class Pojazdy
{
    ...
};

void print(Pojazdy** pojazdy, int size);
void wyrejestruj(Pojazdy**& pojazdy, int& size);

et c.

print не является членом класса Pojazdy, поэтому неправильно помещать прототип внутрь объявление класса Pojazdy.

0 голосов
/ 26 марта 2020

Вы неправильно вызываете функции-члены. print может быть вызван только для объекта типа Pojazdy, поэтому вам нужно сделать что-то вроде:

Pojazdy** poj;
int size{ 0 }, index{ 0 };

Pojazdy x;   // Creates an object of Pojazdy called z

x.print(poj,size); // Calls the print method on x

В качестве альтернативы, если вы не хотите объявлять объект, вы можете сделайте метод static и просто вызовите его для класса.

В файле .h:

static void print(Pojazdy** pojazdy, int size);

А затем в main:

Pojazdy** poj;
int size{ 0 }, index{ 0 };

Pojazdy::print(poj, size); // Calls the print method on the class
...