【问题标题】:error initializing an object of the same class within class definition - C++在类定义中初始化同一类的对象时出错 - C++
【发布时间】:2012-01-01 07:40:03
【问题描述】:

我正在尝试实现以下类。但是,当我尝试在其定义中实例化该类的对象并将“0”作为值传递来初始化该对象时,我收到一个错误:

“需要一个类型说明符”。

谁能解释我怎样才能消除这个错误?

class MessageType
{
public:
    static const MessageType  msgEvent(0);

private:
    MessageType();
    virtual ~MessageType();
    MessageType(int);

};

【问题讨论】:

    标签: c++ object initialization


    【解决方案1】:

    您需要在 cpp 文件中的类定义之外对其进行初始化(定义)。

    MessageType const MessageType::msgEvent;
    

    但是,您这样做的意图不是很清楚。您是否正在尝试实现单例模式,可能这个示例实现可能会有所帮助,我让您决定是否真的需要单例,尽管它有缺点:

    //MessageType.h
    #include <boost/noncopyable.hpp>
    class MessageType: private boost::noncopyable
    {
       public:
         static MessageType* instance();
    
       private:
         MessageType();
         ~MessageType();
         static bool g_initialised;
         // static  initialisation
         static MessageType g_instance;
         // dynamic initialisation
    };
    
    // MessageType.cpp
     #include "MessageType.hpp"
     #include <ostream>
     #include <iostream>
     #include <cstring>
     bool MessageType::g_initialised;
        // static  initialisation
    MessageType MessageType::g_instance;
    
        // dynamic initialisation
     MessageType::MessageType()
     {
         g_initialised = true;
     }
    
     MessageType::~MessageType()
     {
         g_initialised = false;
     }
    
     MessageType* MessageType::instance()
     {
         return g_initialised ? &g_instance : 0;
     }
    

    【讨论】:

    • 但如果我只是创建一个对象而不提供初始化值,它就可以正常工作。
    • @sufyan siddique:它不能正常工作,它只是编译。最终您会看到链接器错误。
    【解决方案2】:

    你只能在定义中初始化静态成员变量,如果它们是 int 类型。

    class MessageType
    {
    public:
        static int sCount = 0; // That is fine.
        static std::string sLogName; // That is fine.
        static std::string sLogName("log.txt"); // Fail!
    };
    

    没有办法绕过这条规则。如果你想初始化一个静态成员变量,那么你必须在cpp中进行:

    std::string MessageType::sLogName("log.txt"); // fine, in the cpp.
    

    同样的规则直接适用于您的 MessageType 实例,与该类是它自己的类型这一事实无关。

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 2021-12-10
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多