带有正向声明的C++Builder模式

C++ Builder Pattern with Forward Declaration

本文关键字:C++Builder 模式 声明      更新时间:2023-10-16

我最近陷入了困境。在第一个版本中,所有内容都在头文件中实现,并且运行良好。在第二个版本中,当我试图将实现与头声明分离时,我遇到了许多错误。在下面的几行中,我将演示这个问题。提前谢谢。。

第一个版本(运行良好!)

摄像值.h

#ifndef CAMERAVALUE_H
#define CAMERAVALUE_H
#include <string>

class CameraValue
{
private:
  class CameraProperties
  {
  private:
    CameraProperties()
      : mId(-1),
        mName(),
        mAddress(),
        mExposure(),
        mFocus()
    {}
    int mId;
    std::string mName;
    std::string mAddress;
    std::string mExposure;
    long long  mFocus;
    friend class CameraValue;
    friend class CameraBuilder;
  };
public:
  class CameraBuilder
  {
  public:
    CameraBuilder(int id)
    {
      mProperties.mId = id;
    }
    CameraBuilder& setName(std::string& name)
    {
      mProperties.mName = name;
      return *this;
    }
    CameraBuilder& setAddress(std::string& adress)
    {
      mProperties.mAddress = adress;
      return *this;
    }
    CameraBuilder& setExposure(std::string& exposure)
    {
      mProperties.mExposure = exposure;
      return *this;
    }
    CameraBuilder& setFocus(int focus)
    {
      mProperties.mFocus = focus;
      return *this;
    }
    CameraValue build()
    {
      return CameraValue(mProperties);
    }
  private:
    CameraProperties mProperties;
  };
private:
  CameraValue(const CameraProperties& properties)
    :mProperties(properties)
    {}
  CameraProperties mProperties;
};
#endif // CAMERAVALUE_H

main.cpp

#include "cameravalue.h"
#include <iostream>
int main(int argc, char *argv[])
{
  CameraValue cm = CameraValue::CameraBuilder(1).setName(std::string("Huseyin")).build();
  return 0;
}

第二个版本(无效)

摄像值.h

#ifndef CAMERAVALUE_H
#define CAMERAVALUE_H
#include <string>

class CameraValue
{
private:
  class CameraProperties;
public:
  class CameraBuilder;
private:
  CameraValue(const CameraProperties& properties);
  CameraProperties mProperties;
};
#endif // CAMERAVALUE_H

cameravalue.cpp

#include "cameravalue.h"
#include <string>

class CameraValue::CameraProperties
{
private:
  CameraProperties()
    : mId(-1),
      mName(),
      mAddress(),
      mExposure(),
      mFocus()
  {}
  int mId;
  std::string mName;
  std::string mAddress;
  std::string mExposure;
  long long  mFocus;
  friend class CameraValue;
  friend class CameraBuilder;
};

class CameraValue::CameraBuilder
{
public:
  CameraBuilder(int id)
  {
    mProperties.mId = id;
  }
  CameraBuilder& setName(std::string& name)
  {
    mProperties.mName = name;
    return *this;
  }
  CameraBuilder& setAddress(std::string& adress)
  {
    mProperties.mAddress = adress;
    return *this;
  }
  CameraBuilder& setExposure(std::string& exposure)
  {
    mProperties.mExposure = exposure;
    return *this;
  }
  CameraBuilder& setFocus(int focus)
  {
    mProperties.mFocus = focus;
    return *this;
  }
  CameraValue build()
  {
    return CameraValue(mProperties);
  }
private:
  CameraProperties mProperties;
};

CameraValue::CameraValue(const CameraProperties& properties)
  : mProperties(properties)
  {}

main.cpp

#include "cameravalue.h"
#include <iostream>
int main(int argc, char *argv[])
{
  CameraValue cm = CameraValue::CameraBuilder(1).setName(std::string("Huseyin")).build();
  return 0;
}

编译错误

cameravalue.cpp
c:usershuseyindocumentsbuilderpatterncameravalue.h(20) : error
C2079: 'CameraValue::mProperties' uses undefined class
'CameraValue::CameraProperties' ..BuilderPatterncameravalue.cpp(74)
: error C2440: 'initializing' : cannot convert from 'const
CameraValue::CameraProperties' to 'int'
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
..BuilderPatterncameravalue.cpp(74) : error C2439:
'CameraValue::mProperties' : member could not be initialized
        c:usershuseyindocumentsbuilderpatterncameravalue.h(20) : see declaration of 'CameraValue::mProperties'
c:usershuseyindocumentsbuilderpatterncameravalue.h(20) : error
C2079: 'CameraValue::mProperties' uses undefined class
'CameraValue::CameraProperties' ..BuilderPatternmain.cpp(9) : error
C2440: '<function-style-cast>' : cannot convert from 'int' to
'CameraValue::CameraBuilder'
        Source or target has incomplete type ..BuilderPatternmain.cpp(9) : error C2228: left of '.setName' must
have class/struct/union ..BuilderPatternmain.cpp(9) : error C2228:
left of '.build' must have class/struct/union
..BuilderPatternmain.cpp(9) : error C2512: 'CameraValue' : no
appropriate default constructor available
..BuilderPatternmain.cpp(10) : error C2039: 'getName' : is not a
member of 'CameraValue'
        c:usershuseyindocumentsbuilderpatterncameravalue.h(8) : see declaration of 'CameraValue'

class CameraBuilder的定义应该在main.cpp中可见,因此不能仅在cameravalue.h中转发声明它。但是您可以使其成员函数的定义不一致:

// cameravalue.h
class CameraValue {
    class CameraBuilder {
    public:
        CameraBuilder(int id);
        ...
    };
};
// cameravalue.cpp
CameraValue::CameraBuilder::CameraBuilder(int id) {
    ...
}