在 C++ 中从配置文件创建类对象

Create Class Objects from Configuration File in C++

提问人:Josiah Peace 提问时间:10/30/2023 更新时间:10/30/2023 访问量:36

问:

我正在编写一个简单的 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

C++ SFML Fstream

评论

0赞 Paul Sanders 10/30/2023
我的假设是,使用变量 shapeName 命名对象会导致问题什么问题?(代码本身看起来没问题)
0赞 Botje 11/3/2023
您可以将所有特定于 Rectangle 的读取代码移动到构造函数中,并使用它来直接读取对象的字段。接下来的问题是如何存储它。阅读有关遗传和多态性的信息。Rectangle(std::istream&)

答: 暂无答案