我想写一个使用另一个类( Class1 )的类( Class2 )。
所以我的代码看起来像这样:
class Class1
{
public:
Class1(const string & filename, some_other_parameters);
...
};
class Class2
{
Class1 C1;
public:
Class2(const string & filename) // I want to verify this filename before passing it to C1 object
};
Class2::Class2(const string & filename)
: C1(filename, some_other_parameters){
}
int main()
{
Class2 myClass("file.txt");
}
那么有没有办法检查文件名,然后再将其传递给 C1 ,还是应该在 main()中执行?< / p>
答案 0 :(得分:8)
只需调用静态函数进行验证,否则转发它的参数:
class Class2
{
Class1 C1;
static const std::string& validate_filename(const std::string& filename);
public:
Class2(const string & filename)
};
const std::string& Class2::validate_filename(const std::string& filename)
{
if (filename.size() < 2)
throw std::runtime_error("filename too short");
return filename;
}
Class2::Class2(const string & filename)
: C1(validate_filename(filename), some_other_parameters){
}
请注意,如果要转换参数,可以使用类似的技巧。所以你可以从宽字符转换为utf8并强制路径为规范格式,...并且仍然有成员变量为const。
您还应该考虑哪个类应该负责验证。如果C1对其参数有约束,那么它应该检查它们。另一方面,如果任何字符串都没问题,但C2有约束,那么它必须进行检查。
答案 1 :(得分:1)
你可以使用指针Class1
#include "stdafx.h"
#include <string>
class Class1
{
public:
Class1(const std::string & filename, int a)
{
// ...
}
};
class Class2
{
Class1 * p_C1;
public:
Class2(const std::string & filename)
{
// ------------------------------------
// Check the file before p_C1 creation
// ------------------------------------
p_C1 = new Class1(filename, 1);
}
~Class2(void)
{
if (p_C1 != NULL) delete p_C1;
}
};
int main()
{
Class2 myClass("file.txt");
}