2013-11-11 8 views
0

Я пытаюсь создать массив рук в классе существ и всех существ, чтобы разделить один и тот же массив объектов (рук). Итак, я пытался это сделать ... но я не знаю, как исправить эту проблему ... попробуйте объяснить мне на уровне начинающих, также, если вы можете предоставить мне некоторые ссылки, чтобы прочитать об использовании «статических», правильно!Статические массивы объектов в классе C++

#include<iostream> 
namespace 
{ 
    int x = 5; 
} 

class Arms 
{ 
    public: 
    int arms = 45; 
}; 

class Creature 
{ 
public : int health; 
     int mana; 
     int dmg; 

     Arms *b[188]; 

     Creature(int); 

}; 
Creature::Creature(int z) 
{ 



    for(int i = 0 ;i< z; i++) 
    { 
     b[i] = new Arms; //<---this is my problem 
     b[i]->arms = z; // <-- this is my problem 
    } 
} 


int main() 
{ 

    Creature c1(12); 

    return 0; 
} 
+0

Если вы хотите, чтобы он был статичным, почему вы не объявили его статическим? Вы хотите, чтобы статическая переменная была повторно инициализирована каждый раз при создании нового Существа? Почему вы устанавливаете его длину на произвольное 188 вместо того, что передается в конструкторе? –

+0

'std :: vector ' – Aleph

+0

Что касается материала для чтения, есть [список хороших книг] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Angew

ответ

1

Прежде всего, вы не должны использовать C-подобные массивы. Используйте контейнер STL, такой как std::array (фиксированный размер, информация о времени компилятора, последовательность) или std::vector (последовательность с переменным размером). Это упростит вашу работу.

Во-вторых, если вы хотите поделиться одним и тем же экземпляром массива оружия со всеми существами, вы можете сделать его статическим.

// in the header 
class Creature 
{ 
public : 
    int health; 
    int mana; 
    int dmg; 

    static std::vector<Arms> arms; 

    Creature(int); 

}; 

// in the .cpp file 
std::vector<Arms> Creature::arms; 
+0

Где находится 'static'? – deepmax

+0

oops, извините, просто пропустил тип 'static' :( –

+0

можно ли у меня полная реализация? – user2979239

0

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

class Arms 
{ 
    public: 
    int arms = 45; // this is pointless since only const members can be initialized within a class; in case you want this to be the default value you should write your own default constructor. 
}; 

Насколько я могу сказать остальную часть кода компилирует и его инициализировать z элементов массива b до значения z. , но если вы объявите новый объект Существа, новый объект будет иметь свою собственную копию массива b. Чтобы решить эту проблему, вы объявляете массив статическим. И поскольку вы делаете это, вы больше не можете иметь массив указателей, поскольку указатели могут содержать адреса памяти, и вам нужно указывать на то же место в памяти: static Arms b [188];

полный код теперь выглядит так:

class Creature 
{ 
public : int health; 
    int mana; 
    int dmg; 

    static Arms b[188]; // this is only a declaration 

    Creature(int); 

}; 

Arms Creature::b[188];// you have to define this outside the class or you'll get a linker error. 

Creature::Creature(int z) 
{ 
    for(int i = 0 ;i< z; i++) 
    { 
     b[i].arms = z;  
    } 
} 

Теперь, если у вас есть один или несколько объектов Существа они будут один и тот же массив и увидеть одни и то же значение для всех элементов.

+0

спасибо, что идеальное решение для моей проблемы я думаю. Спасибо вам снова! – user2979239

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