2017-08-09 43 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

设置全局矢量成为会员。