带有转发声明的C ++ Builder模式

时间:2016-04-13 18:04:16

标签: c++ oop c++11 design-patterns builder

我最近遇到了困境。在第一个版本中,一切都在头文件中实现,它工作正常。在第二个版本中,当我尝试将实现与头部声明分开时,我遇到了很多错误。在下面的行中,我将展示问题。提前谢谢..

第一版(它工作正常!)

cameravalue.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;
}

第二版(不工作)

cameravalue.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:\ users \ huseyin \ documents \ builderpattern \ cameravalue.h(20):错误   C2079:&#39; CameraValue :: mProperties&#39;使用未定义的类   &#39; CameraValue :: CameraProperties&#39; .. \生成器模式\ cameravalue.cpp(74)   :错误C2440:&#39;初始化&#39; :无法转换为&#39; const   CameraValue :: CameraProperties&#39;到&#39; int&#39;           没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符   .. \ BuilderPattern \ cameravalue.cpp(74):错误C2439:   &#39; CameraValue :: mProperties&#39; :成员无法初始化           c:\ users \ huseyin \ documents \ builderpattern \ cameravalue.h(20):查看&#39; CameraValue :: mProperties&#39;的声明   c:\ users \ huseyin \ documents \ builderpattern \ cameravalue.h(20):错误   C2079:&#39; CameraValue :: mProperties&#39;使用未定义的类   &#39; CameraValue :: CameraProperties&#39; .. \ BuilderPattern \ main.cpp(9):错误   C2440:&#39;&#39; :无法转换为&#39; int&#39;至   &#39; CameraValue :: CameraBuilder&#39;           源或目标具有不完整的类型.. \ BuilderPattern \ main.cpp(9):错误C2228:左边的&#39; .setName&#39;必须   有class / struct / union .. \ BuilderPattern \ main.cpp(9):错误C2228:   左边的&#39; .build&#39;必须有class / struct / union   .. \ BuilderPattern \ main.cpp(9):错误C2512:&#39; CameraValue&#39; :不   适当的默认构造函数可用   .. \ BuilderPattern \ main.cpp(10):错误C2039:&#39; getName&#39; : 不是一个   “CameraValue&#39;成员           c:\ users \ huseyin \ documents \ builderpattern \ cameravalue.h(8):查看&#39; CameraValue&#39;

的声明

1 个答案:

答案 0 :(得分:1)

class CameraBuilder中应该可以看到main.cpp的定义,因此您无法在cameravalue.h中正确声明它。但是你可以使其成员函数的定义超出范围:

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

// cameravalue.cpp
CameraValue::CameraBuilder::CameraBuilder(int id) {
    ...
}