【问题标题】:C++ Final class with polymorphism具有多态性的 C++ Final 类
【发布时间】:2021-06-21 02:20:51
【问题描述】:

我有一个抽象类,它为我的应用程序定义了子模块的基本功能。 我们称这个抽象类为IProdBridge

IProdBridge 包含虚拟和非虚拟方法以及一些纯虚拟方法。

由于该软件可在多种不同平台上运行,因此基类处理大部分功能,而其特化处理特定于平台的功能(例如,在某些平台上处理字节序)。

让我们调用专门的类TgurProdBridge

简单地从基类IProdBridge 派生就可以了,但是我想将专用类标记为final,因此将来可能不会被覆盖。

也许我现在只是在放屁,但这就是我的专业类定义的样子:

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(
                    "[[    \033[1;34m%s\033[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 支持进行编译。

为什么我会遇到这个问题?我应该能够将专业课程标记为最终课程;否则final 关键字没有任何意义。

【问题讨论】:

  • 您是说删除final 可以消除错误吗?
  • 是的,删除 final 消除了错误。
  • 这个错误听起来像是 gcc 遇到了IProdBridge 的问题。
  • 这能回答你的问题吗? error: expected class-name before ‘{’ token
  • @SimonC 我的意思是 我们 可以用来重现错误的示例。正如您的回答所示,您涉及的namespaces 未在问题中显示。该问题还包括重现错误所不需要的很多内容 - 但不是重现错误所需的所有内容(对我们而言)。

标签: c++ inheritance polymorphism final


【解决方案1】:

我发现了错误

这可能是 PEBKAC 最糟糕的情况之一,但也许这可以让其他人免于搜索,只要我有。

我不完全确定为什么这不会导致过多的其他编译器错误,但问题在于我的命名空间。

这个类嵌套在两个命名空间中:

namespace MyApp { namespace ProdBridge {

    class ...

} /* namespace ProdBridge */ } /* namespace MyApp */

但是,我的命名空间不是这样的:

namespace { namespace ProdBridge {

    class ...

} /* namespace ProdBridge */ } /* namespace MyApp */

为什么删除final 关键字“已修复”这个错误超出了我的理解。 很抱歉浪费了您的时间?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多