具有多态性的 C++ Final class
C++ Final class with polymorphism
我有一个摘要 class,它为我的应用程序定义了子模块的基本功能。
我们称这个摘要为 class IProdBridge
.
IProdBridge
包含虚拟和非虚拟方法以及一些纯虚拟方法。
因为该软件在多种不同的平台上运行,所以基础 class 处理大部分功能,而其专门处理特定于平台的功能(例如处理某些平台上的字节顺序)。
让我们称之为专门的 class TgurProdBridge
.
简单地从基础 class IProdBridge
派生就可以了,但是我想将特化的 class 标记为 final
,因此它可能不会被重写未来。
也许我现在只是脑袋放屁,但这就是我的专业 class 定义:
class TgurProdBridge final: public IProdBridge {
// ^ error: expected class-name before ‘{’ token
public: // +++ Static +++
static TgurProdBridge& getInstance(milliseconds loopInterval = milliseconds(-1), ProdResponseCallback callback = {},
json settings = "{}"_json, LogLevel logLevel = LOGLEVEL_MAXVALUE, string logPath = "") {
static TgurProdBridge* instance = nullptr;
if (instance == nullptr) {
if (loopInterval == DEFAULT_MS || !callback || settings.empty() || logLevel == LOGLEVEL_MAXVALUE || logPath.size() == 0) {
throw getSysError(0xbada79, "Invalid arguments passed for object instantiation! Did you set all the arguments?");
}
instance = new TgurProdBridge(loopInterval, callback, settings, logLevel, logPath);
}
return instance;
}
public: // +++ Destructor +++
~TgurProdBridge() { }
private: // +++ Constructor / Destructor +++
TgurProdBridge(milliseconds loopInterval, ProdResponseDataCallback callback, json settings, LogLevel logLevel, string logPath):
IProdBridge(loopInterval, callback, settings) {
getLoggerInstance() = new ConsoleLogger(__FUNCTION__, logLevel, true, 0, true, true, logPath, 128);
getLoggerInstance()->setCurrentApplicationName(__FUNCTION__);
getLoggerInstance()->setCurrentLoggerFormat(
"[[ 3[1;34m%s3[0m ]] [%s] [%s] %s",
ILogger::LOG_FMT_APPNAME.c_str(),
ILogger::LOG_FMT_DATETIME.c_str(),
ILogger::LOG_FMT_LOGLVL.c_str(),
ILogger::LOG_FMT_MSG.c_str()
);
}
private: // +++ Const Static (Defaults) +++
};
出于某种原因,我的编译器 (g++ 6) 抛出以下错误:
error: expected class-name before ‘{’ token
class TgurProdBridge final: public IProdBridge {
^
我正在使用 C++ 14 支持进行编译。
为什么我会遇到这个问题?我应该能够将专门的 class 标记为最终的;否则 final
关键字将没有任何意义。
我发现了错误
这可能是 PEBKAC 最糟糕的情况之一,但也许这会像我一样避免其他人进行搜索。
我不完全确定为什么这没有导致过多的其他编译器错误,但问题出在我的命名空间上。
这个 class 嵌套在两个命名空间中:
namespace MyApp { namespace ProdBridge {
class ...
} /* namespace ProdBridge */ } /* namespace MyApp */
然而,我的命名空间不是这样的:
namespace { namespace ProdBridge {
class ...
} /* namespace ProdBridge */ } /* namespace MyApp */
为什么删除 final
关键字“修复”这个错误超出了我的理解范围。
抱歉浪费您的时间
我有一个摘要 class,它为我的应用程序定义了子模块的基本功能。
我们称这个摘要为 class IProdBridge
.
IProdBridge
包含虚拟和非虚拟方法以及一些纯虚拟方法。
因为该软件在多种不同的平台上运行,所以基础 class 处理大部分功能,而其专门处理特定于平台的功能(例如处理某些平台上的字节顺序)。
让我们称之为专门的 class TgurProdBridge
.
简单地从基础 class IProdBridge
派生就可以了,但是我想将特化的 class 标记为 final
,因此它可能不会被重写未来。
也许我现在只是脑袋放屁,但这就是我的专业 class 定义:
class TgurProdBridge final: public IProdBridge {
// ^ error: expected class-name before ‘{’ token
public: // +++ Static +++
static TgurProdBridge& getInstance(milliseconds loopInterval = milliseconds(-1), ProdResponseCallback callback = {},
json settings = "{}"_json, LogLevel logLevel = LOGLEVEL_MAXVALUE, string logPath = "") {
static TgurProdBridge* instance = nullptr;
if (instance == nullptr) {
if (loopInterval == DEFAULT_MS || !callback || settings.empty() || logLevel == LOGLEVEL_MAXVALUE || logPath.size() == 0) {
throw getSysError(0xbada79, "Invalid arguments passed for object instantiation! Did you set all the arguments?");
}
instance = new TgurProdBridge(loopInterval, callback, settings, logLevel, logPath);
}
return instance;
}
public: // +++ Destructor +++
~TgurProdBridge() { }
private: // +++ Constructor / Destructor +++
TgurProdBridge(milliseconds loopInterval, ProdResponseDataCallback callback, json settings, LogLevel logLevel, string logPath):
IProdBridge(loopInterval, callback, settings) {
getLoggerInstance() = new ConsoleLogger(__FUNCTION__, logLevel, true, 0, true, true, logPath, 128);
getLoggerInstance()->setCurrentApplicationName(__FUNCTION__);
getLoggerInstance()->setCurrentLoggerFormat(
"[[ 3[1;34m%s3[0m ]] [%s] [%s] %s",
ILogger::LOG_FMT_APPNAME.c_str(),
ILogger::LOG_FMT_DATETIME.c_str(),
ILogger::LOG_FMT_LOGLVL.c_str(),
ILogger::LOG_FMT_MSG.c_str()
);
}
private: // +++ Const Static (Defaults) +++
};
出于某种原因,我的编译器 (g++ 6) 抛出以下错误:
error: expected class-name before ‘{’ token
class TgurProdBridge final: public IProdBridge {
^
我正在使用 C++ 14 支持进行编译。
为什么我会遇到这个问题?我应该能够将专门的 class 标记为最终的;否则 final
关键字将没有任何意义。
我发现了错误
这可能是 PEBKAC 最糟糕的情况之一,但也许这会像我一样避免其他人进行搜索。
我不完全确定为什么这没有导致过多的其他编译器错误,但问题出在我的命名空间上。
这个 class 嵌套在两个命名空间中:
namespace MyApp { namespace ProdBridge {
class ...
} /* namespace ProdBridge */ } /* namespace MyApp */
然而,我的命名空间不是这样的:
namespace { namespace ProdBridge {
class ...
} /* namespace ProdBridge */ } /* namespace MyApp */
为什么删除 final
关键字“修复”这个错误超出了我的理解范围。
抱歉浪费您的时间