此以下線程程序內的實例:C++不能修改類
void* Nibbler::moveRoutine(void* attr)
{
[...]
Nibbler* game = static_cast<Nibbler*>(attr);
while (game->_continue == true)
{
std::cout << game->_snake->_body.front()->getX() << std::endl; // display 0
std::cout << game->getDirection() << std::endl; // display 0
game->moveSnake();
std::cout << game->_snake->_body.front()->getX() << std::endl; // display 0
std::cout << game->getDirection() << std::endl; // display 42
}
}
[...]
}
我打電話成員函數moveSnake(),這是應該修改形成我的蛇的身體細胞的位置。
void Nibbler::moveSnake()
{
[...]
std::cout << this->_snake->_body.front()->getX() << std::endl; // display 0
this->_snake->_body.front()->setX(3);
this->_direction = 42;
std::cout << this->_snake->_body.front()->getX() << std::endl; // display 3
[...]
}
雖然我的兩個座標我moveSnake內有效地修改()函數,它們不再當我回到我的常規,在那裏他們保持初始值。我不明白爲什麼會發生這種情況,因爲如果我嘗試在我的moveSnake()函數內修改我的類的任何其他值,則實例會被修改,並且會將此值保留在例程中。
了衝切類:
class Nibbler
{
public :
[...]
void moveSnake();
static void* moveRoutine(void*);
private :
[...]
int _direction
Snake* _snake;
IGraphLib* _lib;
pthread_t _moveThread;
...
};
蛇:
class Snake
{
public :
[...]
std::vector<Cell*> _body;
};
最後的細胞:
class Cell
{
public :
void setX(const int&);
void setY(const int&);
int getX() const;
int getY() const;
Cell(const int&, const int&);
~Cell();
private :
int _x;
int _y;
};
的cell.cpp代碼:
void Cell::setX(const int& x)
{
this->_x = x;
}
void Cell::setY(const int& y)
{
this->_y = y;
}
int Cell::getX() const
{
return this->_x;
}
int Cell::getY() const
{
return this->_y;
}
Cell::Cell(const int& x, const int& y)
{
this->_x = x;
this->_y = y;
}
Cell::~Cell()
{}
在我看來,你是在一個多線程環境(或者我沒有看到'moveRoutine'使用靜態方法的觀點)。也許另一個線程在同一時間重新初始化數據。並且要在C++中創建一個線程,如果需要,最好使用'std :: thread'並最終使用'std :: bind',這將保留類結構並防止使用'void *' – Geoffroy
我在這裏使用的唯一線程是調用moveRoutine的那個。此外,如果我在moveSnake()中設置了任何其他屬性,它將起作用,所以我猜測問題來自於我以這種方式在我的向量中設置Cell的事實,但我看不出爲什麼。 – Kernael
你可以顯示set()和get()的代碼嗎?我沒有看到你的代碼不能工作的原因。 @Geoffrey:另一個線程怎麼會在那裏干擾?除非在Snake中有一個reset()方法或類似的東西。顯示的用於設置和獲取的測試代碼顯然是在單個線程中,所以不應該存在缺失寫入問題。 –