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