2013-04-09 5 views
0

Как хранить объект класса внутри самого класса?Хранить объект класса внутри самого класса

Я знаю, что мне нужно использовать статическое ключевое слово для выполнения того, что я хочу. Таким образом, класс должен выглядеть примерно так:

class my_class { 
public: 
    static my_class instance; 
    my_class() { 
     my_class::instance = this 
    } 
}; 

Ниже приводится точный код, как он появляется в классе

namespace ArmISA { 
    class ISA { 
     protected: 
      static ISA* isa; 
      MiscReg miscRegs[NumMiscRegs]; 
      const IntRegIndex *intRegMap; 
      ..... 
     public: 
      ISA() { 
       ISA::isa = this; 
       ... 
      } 
     ... 
    }; 
} 

Ошибки я получаю:

error: could not convert 'ArmISA::ISA::isa' from 'ArmISA::ISA*' to 'ArmISA::ISA'

+0

ошибка не вызвана представленным кодом –

+0

Я вижу, очень хорошо, я постараюсь углубиться в то, что может быть причиной. Однако, похоже, он компилируется, когда я использую 'static ISA isa; ISA :: isa = * this; ' Означает ли это, что такое проблема? Может быть, это какая-то форма неполного объявления? –

ответ

1

my_class::instance = *this; будет работать, но я надеюсь, что вы знаете, что каждый раз, когда вы создаете новый экземпляр класса, ваш член instance будет перезаписан. Кроме того, это означает, что instance - это копия *this, а не ссылка - изменения в них невидимы для другого.

Другой вариант объявить instance как указатель, в этом случае оба указателя ссылаются на тот же объект, а затем instance = this; будет составлять:

static my_class* instance; 

Однако я не уверен, что именно вы пытаетесь достичь.

0

this является указателем , Используйте my_class::instance = *this.

+0

Это работает .. но не могли бы вы объяснить, почему следующее не делает? класс my_class { общественный: статический my_class * экземпляр; my_class() { my_class :: instance = this; } }; –

+0

Какой бы смысл делать это –

+0

Если вопрос был направлен на меня, я изменяю существующий код с открытым кодом C++ и пытаюсь получить ссылку на объект, который, как я знаю, создается только один раз –

0

Для инициализации статической переменной-члена нецелого типа (или, в C++ 11, не constexpr), сделайте это вне класса.

Например:

struct Foo 
{ 
    static Foo bar; 
    double x_; 
    Foo(double x): x_(x) {} 
}; 

// Preferably in an implementation file: 
Foo Foo::bar(3.14); 

Объявление вне класса всегда формально определение, который обеспечивает хранение переменной (необходимо, если вы когда-нибудь адрес).


Если вы хотите, чтобы предоставить заголовок-файл только модуль, одна альтернатива, чтобы обеспечить доступ к статической переменной с помощью функции, например:

struct Foo 
{ 
    static Foo& bar() 
    { 
     static Foo theBar(3.14); 
     return theBar; 
    } 

    double x_; 
    Foo(double x): x_(x) {} 
}; 

Другой метод заключается наследовать от класса, который предоставляет статическую переменную.

+0

Первый рекламный блок кода подвергается статическому фиаско порядка инициализации, предпочитает второй рекламный блок. –

+1

@downvoter: пожалуйста, объясните свое нижестоящее, чтобы другие могли чему-то научиться –

+0

Я все еще расплывчато по поводу того, почему это меня оповело ... (я не сделал нисходящего) –

Смежные вопросы