Форум программистов

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Форум программистов (https://programmersforum.ru/index.php)
-   Общие вопросы C/C++ (https://programmersforum.ru/forumdisplay.php?f=14)
-   -   Не видит методы класса из другого файла (https://programmersforum.ru/showthread.php?t=346862)

iXNomad 04.04.2024 14:43

Не видит методы класса из другого файла
 
Сама программа работает, если не использовать Stack.h код файла Stack.cpp находится в файле Main.cpp. Но пытаюсь перенести в другой модуль и соединить через интерфейс, не работает, ругается на undefined reference to "Stack::push(int)" и медот извлечения тоже.
Что я делаю не так?


Код:

// Main.cpp 04.04.2024

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

int main()
{
    int val;
    int count = 0;
    Stack stack;

    while (true) {
        std::cin >> val;
        if(val == 0)
            break;
        stack.push(val);
        count++;
    }
   
    for (int i = 0; i < count; i++) {
        val = stack.pop();
        std::cout << val << std::endl;
    }
}

Код:

// Stack.h 04.04.2024

#pragma once

class Stack {
public:
    void push(int);
    int pop();
};

Код:

// Stack.cpp 04.04.2024

class Stack {
private:
    struct m_element
    {
        int data;
        m_element* prev;
    };
   
    int m_size;
    m_element* m_stack_pointer;
   
public:
    void push(int val)
    {
        m_element* m_new_element;
        m_new_element = new m_element;
        m_new_element->prev = m_stack_pointer;
        m_new_element->data = val;
        m_stack_pointer = m_new_element;       
    }
   
    int pop()
    {
        int val = m_stack_pointer->data;
        m_element* prev = m_stack_pointer->prev;
        delete m_stack_pointer;
        m_stack_pointer = prev;
        return val;
    }
};


p51x 04.04.2024 15:50

в Stack.cpp у вас должны остаться только реализации функций:
Код:

void Stack::push(int val){...}
и, естественно, Stack.cpp должен участвовать в компиляции

iXNomad 05.04.2024 09:04

Цитата:

Сообщение от p51x (Сообщение 1865395)
в Stack.cpp у вас должны остаться только реализации функций:
Код:

void Stack::push(int val){...}
и, естественно, Stack.cpp должен участвовать в компиляции

А что правильно делать с приватными полями? Просто мне показалось что в интерфейсе зачем они?

p51x 05.04.2024 09:21

Так вы не сделали интерфейс. Если хотели интерфес, то надо что-то типа:
Код:

class IStack {
public:
    void push(int) = 0;
    int pop() = 0;
};

Код:

class Stack : public IStack {
private:
    struct m_element
    {
        int data;
        m_element* prev;
    };
   
    int m_size;
    m_element* m_stack_pointer;
   
public:
    void push(int val) override
    {
        m_element* m_new_element;
        m_new_element = new m_element;
        m_new_element->prev = m_stack_pointer;
        m_new_element->data = val;
        m_stack_pointer = m_new_element;       
    }
   
    int pop() override
    {
        int val = m_stack_pointer->data;
        m_element* prev = m_stack_pointer->prev;
        delete m_stack_pointer;
        m_stack_pointer = prev;
        return val;
    }
};


iXNomad 05.04.2024 10:57

Цитата:

Сообщение от p51x (Сообщение 1865405)
Так вы не сделали интерфейс. Если хотели интерфес, то надо что-то типа:
Код:

class IStack {
public:
    void push(int) = 0;
    int pop() = 0;
};

Код:

class Stack : public IStack {
private:
    struct m_element
    {
        int data;
        m_element* prev;
    };
   
    int m_size;
    m_element* m_stack_pointer;
   
public:
    void push(int val) override
    {
        m_element* m_new_element;
        m_new_element = new m_element;
        m_new_element->prev = m_stack_pointer;
        m_new_element->data = val;
        m_stack_pointer = m_new_element;       
    }
   
    int pop() override
    {
        int val = m_stack_pointer->data;
        m_element* prev = m_stack_pointer->prev;
        delete m_stack_pointer;
        m_stack_pointer = prev;
        return val;
    }
};


Пока сделал так как вы написали в первом варианте, рановато ещё мне в дебри ООП лезть с абстракциями виртуальными всякими вещами и т.д., немножко попозже, как пройду несколько глав книги.

Код:

// Main.cpp 05.04.2024

#include <iostream>
#include <string>
#include "IntStack.h"


void testAuto(IntStack stack)
{
    int val;
    int count = 0;
    while (true)
    {
        std::cin >> val;
        if(val == 0)
            break;
        stack.push(val);
        count++;
    }
           
    for (int i = 0; i < count; i++)
    {
        try {
            val = stack.pop();
        } catch (UnderflowException) {
            std::cout << "FATAL ERROR CODE 0x00000002: STACK IS EMPTY!!!!!" << std::endl;
            continue;
        }
        std::cout << val << std::endl;
    }
}

void testManual(IntStack stack)
{
    int val;
    while (true) {
        std::cin >> val;
        if(val == 0)
        {
            try {
                val = stack.pop();
            } catch (UnderflowException) {
                std::cout << "FATAL ERROR CODE 0x00000002: STACK IS EMPTY!!!" << std::endl;
                continue;
            }
            std::cout << val << std::endl;
            continue;
        }
        stack.push(val);
    }
}

int main(int argc, char** argv)
{
    IntStack stack;
   
    if (argc != 2)
    {
        std::cout << "FATAL ERROR CODE 0x00000000: INVALID COMMAND LINE PARAMETERS!!!!!!!" << std::endl;
        return 1;
    }
   
    std::string mode = argv[1];

    if (!mode.compare("AUTO"))
    {
        testAuto(stack);
    } else if (!mode.compare("MANUAL"))
    {
        testManual(stack);
    } else {
        std::cout << "FATAL ERROR CODE 0x00000001: INVALID TEST MODE, USE AUTO OR MANUAL!!!!!!!" << std::endl;
    }
}

Код:

// Stack.h 05.04.2024

#pragma once


class IntStack {
private:
    struct m_element
    {
        int data;
        m_element* prev;
    };
   
    unsigned int m_size;
    m_element* m_stack_pointer;
   
public:
    IntStack();
    void push(int);
    int pop();

    unsigned int getSize();
};

class UnderflowException {};

Код:

// Stack.cpp 05.04.2024

#include "IntStack.h"


IntStack::IntStack()
{
    m_size = 0;
}

void IntStack::push(int val)
{
    m_element* new_element;
    new_element = new m_element;
    new_element->prev = m_stack_pointer;
    new_element->data = val;
    m_stack_pointer = new_element;
    m_size++;
}

int IntStack::pop()
{
    if (m_size == 0)
        throw UnderflowException();
    int val = m_stack_pointer->data;
    m_element* prev = m_stack_pointer->prev;
    delete m_stack_pointer;
    m_stack_pointer = prev;
    m_size--;
    return val;
}

unsigned int IntStack::getSize()
{
    return m_size;
}



03:00.