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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2024, 14:43   #1
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 52
По умолчанию Не видит методы класса из другого файла

Сама программа работает, если не использовать Stack.h код файла Stack.cpp находится в файле Main.cpp. Но пытаюсь перенести в другой модуль и соединить через интерфейс, не работает, ругается на undefined reference to "Stack:ush(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;
    }
};
iXNomad вне форума Ответить с цитированием
Старый 04.04.2024, 15:50   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,772
По умолчанию

в Stack.cpp у вас должны остаться только реализации функций:
Код:
void Stack::push(int val){...}
и, естественно, Stack.cpp должен участвовать в компиляции
p51x вне форума Ответить с цитированием
Старый 05.04.2024, 09:04   #3
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 52
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
в Stack.cpp у вас должны остаться только реализации функций:
Код:
void Stack::push(int val){...}
и, естественно, Stack.cpp должен участвовать в компиляции
А что правильно делать с приватными полями? Просто мне показалось что в интерфейсе зачем они?

Последний раз редактировалось iXNomad; 05.04.2024 в 09:24.
iXNomad вне форума Ответить с цитированием
Старый 05.04.2024, 09:21   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,772
По умолчанию

Так вы не сделали интерфейс. Если хотели интерфес, то надо что-то типа:
Код:
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;
    }
};
p51x вне форума Ответить с цитированием
Старый 05.04.2024, 10:57   #5
iXNomad
Пользователь
 
Регистрация: 06.01.2021
Сообщений: 52
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Так вы не сделали интерфейс. Если хотели интерфес, то надо что-то типа:
Код:
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;
}
iXNomad вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не видит класс из другого файла? CraZZZy-GameRRR Общие вопросы C/C++ 5 12.10.2018 22:22
Вызов функции из одного класса кнопкой из другого класса lexflax Qt и кроссплатформенное программирование С/С++ 1 12.12.2014 21:48
Реализация работы с классами, конструктор, методы класса и переменные класса / Java EE (J2EE) pashkevych Помощь студентам 60 21.08.2014 10:49
Конструктор класса не хочет принимать в качестве параметра адрес объекта другого класса Jugger Помощь студентам 3 05.01.2012 04:10
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54