ошибка инициализации объекта того же класса в определении класса - C ++ - PullRequest
1 голос
/ 18 ноября 2011

Я пытаюсь реализовать следующий класс. Однако, когда я пытаюсь создать экземпляр объекта класса в его определении и передать «0» в качестве значения для инициализации объекта, я получаю сообщение об ошибке:

"ожидается указатель типа".

Может кто-нибудь объяснить, как я могу удалить эту ошибку?

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

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

};

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Вы можете инициализировать статические переменные-члены в определении, только если они имеют тип 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 и не имеет ничего общего с тем фактом, что класс имеет свой собственный тип.

1 голос
/ 18 ноября 2011

Вам нужно инициализировать (определить) его вне определения класса в файле cpp.

MessageType const MessageType::msgEvent;

Однако, Ваше намерение сделать это не очень ясно.Пытаетесь ли вы реализовать шаблон Singleton, вероятно, этот пример реализации может помочь, я оставляю вам решать, действительно ли вам нужен Singleton, несмотря на его недостатки:

//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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...