2017-08-09 74 views
-1

Heyo!我對C++相當陌生,但在編碼方面有一些背景知識,所以簡單的解釋會很棒。我一直在做一個相當複雜的程序,出現了一個問題。我有一個名爲「Tile」的對象正在向量中創建。矢量對象不正確設置向量中的信息(C++)

for (int i = 0; i <= ySize; i++) { 
    for (int i2 = 0; i2 <= xSize; i2++) { 
     tiles.push_back(make_unique <Tile>()); 
     tiles[i*xSize + i2]->set_height(fn.GetNoise(i2, i)); 
     tiles[i*xSize + i2]->set_xPos(i2); 
     tiles[i*xSize + i2]->set_yPos(i); 
     tiles[i*xSize + i2]->update_tile(); 
    } 
    cout << endl; 
} 

理想情況下,瓷磚是以網格方式生成的。瓦片對象內有一個稱爲「商品」的矢量。

vector unique_ptr<Good*> goods; 

這些貨物是通過雙加for循環的位置:

for (int i = 0; i <= ySize; i++) { 
    for (int i2 = 0; i2 <= xSize; i2++) { 
     if (tiles[i*xSize + i2]->get_rainfall() >= 0.1 && tiles[i*xSize + i2]->get_height() >= -0.2 && tiles[i*xSize + i2]->get_height() <= 0.55 && fn.GetNoise(i2, i) < 0) { 
      tiles[i*xSize + i2]->add_available_good(1001, (fn.GetNoise(i, i2)*500+214)); 
      tiles[i*xSize + i2]->update_tile(); 
     } 
    } 
} 

這個載體會以一流的良好的子類存儲通過這裏:

void Tile::add_available_good(short unsigned int g, short int a) { 
//Adds good based on GoodID 
switch (g) { 
case 1001: 
    goods.emplace_back(new Tree(a)); 
    break; 
case 1002: 

    break; 
default: 

    break; 
} 

}

的出現的問題是,只要我打電話給瓷磚

[i*xSize + i2]->add_available_good(num, num); 

有些事情變得有趣。任何給定瓦片上的矢量商品的大小成爲添加到所有瓦片的商品的數量。換句話說,貨物向量似乎在所有瓦片對象之間共享。我該如何解決?

我在解釋事情上很糟糕,但我盡力了。先謝謝你!

瓷磚類的定義:

#include <iostream> 
#include <windows.h> 
#include <string> 
#include <vector> 
#include <locale> 
#include <random> 
#include <memory> 

using namespace std; 

//Misc inclusions 
#include "Building.h" 
#include "Good.h" 

class Tile 
{ 
public: 
Tile(); 
void print_tile(); 
void set_tile_symbol(char); 
char get_tile_symbol(); 
void set_tile_color(float); 
float get_tile_color(); 
void add_building(short unsigned int); 
void set_height(double); 
double get_height(); 
void update_tile(); 
void add_available_good(short unsigned int, short int); 
void set_rainfall(double); 
double get_rainfall(); 
void set_xPos(int); 
void set_yPos(int); 
short unsigned int get_good(short unsigned int); 
short unsigned int get_good_weight(short unsigned int); 
void print_good(); 
~Tile(); 
private: 

char symbol; 
int xpos; 
int ypos; 
float color; 
short unsigned int usableSpace = 36; 
double height = 0; 
int pop = 0; 
bool hasPop = 0; 
double rainfall = 0; 
}; 

好類的定義:

class Good 
{ 
public: 
Good(); 
void set_weight(double); 
void change_weight(double); 
double get_weight();   
void set_value(double); 
double get_value(); 
void change_value(double); 
short unsigned int get_symbolShowsAt(); 
char get_symbol(); 
short unsigned int get_goodID(); 
~Good();  
protected: 
double weight; 
short unsigned int reqFunction[5]; 
short unsigned int reqGoodID[5]; 
short unsigned int goodWeight[5]; 
double value = 1; 
short unsigned int goodID = 1000; 
short unsigned int functionID = 4000; 
bool hasSymbol = 0; 
short unsigned int symbolShowsAt = 100; 
char symbol = 0; 
int size = 1; 
}; 
struct Tree : public Good { Tree(short unsigned int w); }; 
+0

請包括[mcve]。有足夠的代碼可以讓人編譯它並重現你的問題(而不是更多)。現在你錯過了一些重要的東西,比如'Tile'的定義和'goods'的語法上有效的定義。 –

+0

我會但它是幾百行代碼總數。不過,添加Tile和Good的類定義,感謝您的建議 –

+0

請閱讀鏈接。幾百行失敗「[mcve]」的「最小」部分。將代碼剝離爲一個編譯和演示您的問題的最小示例。 –

回答

-1

設置全局矢量成爲會員。