提问人:Josiah Peace 提问时间:10/30/2023 更新时间:10/30/2023 访问量:36
在 C++ 中从配置文件创建类对象
Create Class Objects from Configuration File in C++
问:
我正在编写一个简单的 C++ 程序,它使用 fstream 来存储配置文件中的数据,稍后将在 SFML 窗口中使用。配置文件为程序中的不同实体提供参数:
Window 800 600
Font fonts/tech.ttf 18 255 255 255
Circle CGreen 100 100 -0.03 0.02 0 255 0 50
Circle CBlue 200 200 0.02 0.04 0 0 255 100
Circle CPurple 300 300 -0.02 -0.01 255 0 255 75
Rectangle RRed 200 200 0.1 0.15 255 0 0 50 25
Rectangle RGrey 300 250 -0.02 0.02 100 100 100 50 100
Rectangle RTeal 25 100 -0.02 -0.02 0 255 255 100 100
每行的第一项指定该给定实体的参数。即窗口宽度 = 800,高度 = 600。其他参数是将在屏幕上绘制的对象的初始位置和速度。
我目前正在尝试存储每个项目;我目前还不关心处理数据。
我成功地存储了 Window 和 Font 的数据,因为它们只指定了一次。一旦我开始尝试存储形状中的数据,我就遇到了问题。以下是我收集窗口和字体数据的方法:
ifstream myFile;
myFile.open("config.txt");
if(myFile.is_open())
{
string param;
int wWidth, wHeight;
string fontFile; int fontSize, fR, fG, fB;
while (myFile >> param)
{
if(param == "Window")
{
myFile >> wWidth >> wHeight;
}
if(param == "Font")
{
myFile >> fontFile >> fontSize >> fR >> fG >> fB;
}
由于有多行指定矩形或圆形,我认为最好的方法是为每个形状创建一个类,并使用从文件中引入的数据创建该类的对象。到目前为止,我只制作了 Rectangle 类:
class Rectangle
{
public:
string Name;
float X, Y, SX, SY;
int R, G, B;
float Width, Height;
};
int main()
{
ifstream myFile;
myFile.open("config.txt");
if(myFile.is_open())
{
string param, shapeName;
float initPositionX, initPositionY, initSpeedX, initSpeedY, rWidth, rHeight;
int R, G, B;
while (myFile >> param)
{
if (param == "Rectangle")
{
// import the data
myFile >> shapeName >> initPositionX
>> initPositionY >> initSpeedX
>> initSpeedY >> R >> G >> B
>> rWidth >> rHeight;
// create an object and set attributes from data retrieved
Rectangle shapeName;
shapeName.X = initPositionX;
shapeName.Y = initPositionY;
shapeName.SX = initSpeedX;
shapeName.SY = initSpeedY;
shapeName.R = R;
shapeName.G = G;
shapeName.B = B;
shapeName.Width = rWidth;
shapeName.Height = rHeight;
}
}
}
return 0;
}
我的假设是用变量命名对象会导致问题,但这是我能想到的唯一方法,将配置文件数据直接输入到类对象中。如果有人有任何建议,我将不胜感激。shapeName
答: 暂无答案
上一个:指向模板化虚拟基类的指针的问题
评论
Rectangle(std::istream&)