Я пытаюсь объединить разные ветви для создания новой версии munin-node-win32.
Я сейчас пытаюсь заставить эту вилку работать.
https://github.com/hugohallqvist/munin-node-win32/tree/hugodevel
Но я получаю следующую ошибку.
src\core\MuninPluginManager.cpp(135): error C2259: 'PerfCounterCustomMuninNodePlugin': cannot instantiate abstract class
src\core\MuninPluginManager.cpp(135): note: due to following members:
src\core\MuninPluginManager.cpp(135): note: 'bool MuninNodePlugin::AutoConf(void)': is abstract
c:\users\username\projekte\munin-node-win3264\src\core\MuninNodePlugin.h(14): note: see declaration of 'MuninNodePlugin::AutoConf'
Я думаю, что это важные фрагменты кода.
MuninNodePlugin.h
class MuninNodePlugin {
public:
virtual ~MuninNodePlugin() {};
/// This method should always be thread-safe
virtual bool IsLoaded() = 0;
/// This method should also always be thread-safe
virtual const char *GetName() = 0;
virtual bool AutoConf() = 0;
virtual int GetConfig(char *buffer, int len) = 0;
virtual int GetValues(char *buffer, int len) = 0;
virtual bool IsThreadSafe();
};
MuninPluginManager.cpp
// Add all the PerfCounterCustom Plugins
{
const char *perfPrefix = PerfCounterCustomMuninNodePlugin::SectionPrefix;
size_t perfPrefixLen = strlen(perfPrefix);
for (size_t i = 0; i < g_Config.GetNumKeys(); i++) {
std::string keyName = g_Config.GetKeyName(i);
if (keyName.compare(0, perfPrefixLen, perfPrefix) == 0) {
PerfCounterCustomMuninNodePlugin *plugin = new PerfCounterCustomMuninNodePlugin(keyName);
if (plugin->IsLoaded()) {
AddPlugin(plugin);
} else {
_Module.LogError("Failed to load Custom PerfCounter plugin: [%s]", keyName.c_str());
delete plugin;
}
}
}
}
Я почти ничего не знаю о C ++, поэтому я не понимаю уже опубликованные решения для этой ошибки.
Я бы предпочел быстрое исправление типа «измени эту строку, и она должна работать».
Странно то, что этот код прямо над другим блоком не выдает ошибку, даже почти идентично. : /
// Add all the regular PerfCounter Plugins
{
const char *perfPrefix = PerfCounterMuninNodePlugin::SectionPrefix;
size_t perfPrefixLen = strlen(perfPrefix);
for (size_t i = 0; i < g_Config.GetNumKeys(); i++) {
std::string keyName = g_Config.GetKeyName(i);
if (keyName.compare(0, perfPrefixLen, perfPrefix) == 0) {
PerfCounterMuninNodePlugin *plugin = new PerfCounterMuninNodePlugin(keyName);
if (plugin->IsLoaded()) {
AddPlugin(plugin);
} else {
_Module.LogError("Failed to load PerfCounter plugin: [%s]", keyName.c_str());
delete plugin;
}
}
}
}
PerfCounterCustomMuninNodePlugin.h
#pragma once
#include "core/MuninNodePlugin.h"
struct Field {
std::string name;
std::string preParsedArgs;
// PerfCounter API params
struct Counter {
std::string path;
HCOUNTER handle;
DWORD format;
double multiply;
} counter;
};
class PerfCounterCustomMuninNodePlugin : public MuninNodePluginHelper
{
public:
/// \param sectionName The INI File section name for this plugin
PerfCounterCustomMuninNodePlugin(const std::string §ionName);
virtual ~PerfCounterCustomMuninNodePlugin();
virtual int GetConfig(char *buffer, int len);
virtual int GetValues(char *buffer, int len);
virtual bool IsLoaded() { return m_Loaded; };
static const char *SectionPrefix;
private:
bool OpenCounter();
bool m_Loaded;
std::string m_SectionName;
HQUERY m_PerfQuery;
// All the fields are represented here
std::map<std::string, Field> m_Fields;
// Precomputed graph parameters
std::string m_GraphParameters;
};
Задача ещё не решена.
Других решений пока нет …