Чтение ошибок компилятора обычно помогает. Вы должны научиться понимать, что говорит вам компилятор. Тот факт, что он жалуется на переопределение символа, говорит о том, что вы нарушаете Правило Единого Определения. Тогда он даже скажет вам, что это за символы:
class GnuPlot {
//...
GnuPlot& reset_plot(); // <-- declaration
//...
};
//...
Gnuplot& Gnuplot::reset_plot() { // <-- Definition
nplots = 0;
return *this;
}
Вы можете объявить символ столько раз, сколько пожелаете в программе, но вы можете определить его только один раз (если он не встроен). В этом случае reset_plot
компилируется и определяется во всех единицах перевода, которые включают заголовок, что нарушает правило единого определения.
Самый простой выход из этого - объявить его встроенным, чтобы он мог появиться в более чем одном модуле компиляции и позволить компоновщику удалить избыточные копии (если таковые имеются) позже.
Немного более проблематичными являются статические члены, которые должны быть объявлены внутри класса и определены (только один раз) в модуле перевода. Для этого вы можете либо создать файл .cpp, чтобы определить эти переменные (и любые функции / методы, которые вам не нужны, встроенные в заголовок).