Я не могу заставить компоновщик msv c правильно работать на vscode - PullRequest
0 голосов
/ 18 января 2020

У меня есть эта действительно простая программа, которая состоит из 2 файлов. main. cpp имеет функцию main:

[main.cpp]
#include <iostream>
#include <string>
#include "calculator.h"

using namespace std;

int main() {
    Calculator calc;
    do {
        string op, left, right;
        float out;

        cout << endl << "insert an operator and two numbers: ";
        cin >> op;
        if (calc.isOperator(op)) {
            cin >> left;
            cin >> right;
            out = calc.doOp(op, left, right);
            cout << endl << "result: " << endl;
        }
        else
            cout << endl << "invalid operator" << endl;

    } while(true);
}

calculator. cpp имеет класс Calculator, а calculator.h имеет объявление для класса и каждой функции или переменной в нем.

[calculator.cpp]
#include <iostream>
#include <cmath>
#include <vector>
#include <string>

using namespace std;

class Calculator {
    vector<float>* mem_stack;

public:
    Calculator() {
        mem_stack = new vector<float>();
    }

    ~Calculator() {
        delete mem_stack;
    }

    float memPeek() {
        return (*mem_stack).back();
    }

    float memPeek(const int& age) {
        return (*mem_stack)[(*mem_stack).size() - age];
    }

    float doOp(const string& op, string& left, string& right) {
        float a, b;

        if (left[0] == 'r') {
            left = left.substr(1, left.size() - 1);
            a = memPeek(stoi(left));
        }
        else
            a = stoi(left);

        if (right[0] == 'r') {
            right = right.substr(1, right.size() - 1);
            b = memPeek(stoi(right));
        }
        else
            b = stoi(right);

        float out;
        if (op == "+")
            out = a + b;
        else if (op == "-")
            out = a - b;
        else if (op == "*")
            out = a * b;
        else if (op == "/")
            out = a / b;
        (*mem_stack).push_back(out);

        return memPeek();
    }

    bool isOperator(const string& op) {
        bool out;
        out = op == "+" && op == "-" && op == "*" && op == "/";
        return out;
    }
};
[calculator.h]
#pragma once
#include <vector>
#include <string>

class Calculator {
private:
    std::vector<float>* mem_stack;
public:
    Calculator();
    ~Calculator();
    float memPeek();
    float memPeek(const int& age);
    float doOp(const std::string& op, std::string& left, std::string& right);
    bool isOperator(const std::string& op);
};

Когда я пытаюсь скомпилировать программу, я получаю неразрешенные ошибки компоновки в основной функции. Все они выглядят так:

main.obj : error LNK2019: unresolved external symbol

Я получаю их для каждой функции из калькулятора. cpp вызывается в main, включая конструктор и деструктор. Я просмотрел все, что смог найти, но все равно получаю эти ошибки. Кто-нибудь может мне помочь? Я все еще просто ладья ie.

1 Ответ

0 голосов
/ 14 февраля 2020

Добро пожаловать в StackOverflow!

Возможно, вы уже решили эту проблему, но ваша проблема довольно проста: в вашем файле Calculator.cpp вы в основном изменяете метку другой класс Calculator , который затеняет исходный, который заканчивается без определенных функций для него (только объявления в файле .h). Чтобы решить эту проблему, вы вместо этого объявляете свои функции-члены с ClassName::functionName() вместо .cpp.

Не пытался компилировать, но это должно работать:

[calculator.cpp]
#include <iostream>
#include <cmath>
#include <vector>
#include <string>

using namespace std;


Calculator::Calculator() {
    mem_stack = new vector<float>();
}

Calculator::~Calculator() {
    delete mem_stack;
}

float Calculator::memPeek() {
    return (*mem_stack).back();
}

float Calculator::memPeek(const int& age) {
    return (*mem_stack)[(*mem_stack).size() - age];
}

float Calculator::doOp(const string& op, string& left, string& right) {
    float a, b;

    if (left[0] == 'r') {
        left = left.substr(1, left.size() - 1);
        a = memPeek(stoi(left));
    }
    else
        a = stoi(left);

    if (right[0] == 'r') {
        right = right.substr(1, right.size() - 1);
        b = memPeek(stoi(right));
    }
    else
        b = stoi(right);

    float out;
    if (op == "+")
        out = a + b;
    else if (op == "-")
        out = a - b;
    else if (op == "*")
        out = a * b;
    else if (op == "/")
        out = a / b;
    (*mem_stack).push_back(out);

    return memPeek();
}

bool Calculator::isOperator(const string& op) {
    bool out;
    out = op == "+" && op == "-" && op == "*" && op == "/";
    return out;
}

В качестве стороны заметьте, я не знаю вашего опыта программирования, но одна вещь показалась мне очень странной в вашем коде. Возможно, вы пришли из Java или C#, где вам всегда нужно инициализировать переменные-члены объекта; C ++ немного больше похож на C в этом отношении, поскольку он позволяет вам хранить объекты по значению, а не только по ссылке. Это означает, что вам не нужно иметь указатель на ваш vector<float> или распределять / освобождать его самостоятельно; пусть компилятор сделает всю работу за вас и использует ее по значению.

Так что вместо того, чтобы делать std::vector<float>* mem_stack;, просто выполните std::vector<float> mem_stack;; это делает такие операции, как (*mem_stack).push_back(out); (или альтернативный mem_stack->push_back(out);, используя оператор опоздания ->) намного чище: mem_stack.push_back(out);

...