Несколько человек уже указали решение проблемы, с которой вы столкнулись.
Я добавлю кое-что другое.Вам нужны только охранники заголовков в ваших заголовках.Вы также включили их в свои исходные файлы , где они действительно не имеют смысл.Например, я закомментировал строки, которые вам действительно не нужны (или даже не нужны) в sum.cpp:
//#ifndef SUM_C
//#define SUM_C
//
#include <vector>
#include <string>
#include <iostream>
#include "Sum.h"
void Sum::perform(std::vector<std::string> vec) {
using namespace std;
int total = 0;
cout << "Total: " << total << "\n";
};
//#endif // SUM_C
Просто FWIW вместо perform
, я бы использовал operator()
:
class Operation {
public:
virtual void operator()(std::vector<std::string> vec) = 0;
};
и (очевидно) это также то, что вы бы перегружали для Sum
.Чтобы использовать его вместо чего-то вроде:
Sum op;
op.perform();
Вы бы использовали что-то вроде:
Sum op;
op();
Это особенно удобно, когда вы комбинируете свой класс с другими (например,стандартная библиотека), которая вызывает операции, такие как функции, являются ли они действительно функциями или «функторами» (такие классы, которые перегружают operator()
, так что синтаксически они могут использоваться почти как функции).