-1
Heyo!私はC++にはかなり新しいですが、コーディングの背景があるので、簡単な説明は素晴らしいでしょう。私はかなり複雑なプログラムに取り組んでおり、問題が出てきました。私はベクトルで作られた "タイル"と呼ばれるオブジェクトを持っています。ベクトルを持つオブジェクトがベクトルの情報を正しく設定していない(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 (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); };
[mcve]を含めてください。誰かがそれをコンパイルして問題を再現できるほどのコード。現在、「タイル」の定義や文法的に有効な「財」の定義など、重要なことがいくつか欠落しています。 –
しかし、それは数百行のコード合計です。病気と良いのクラス定義を追加するが、アドバイスのおかげで –
リンクをお読みください。数百行が "[mcve]"の "最小"部分に失敗します。問題をコンパイルして示す最小限の例にコードを分解してください。 –