C ++类 - 在将参数传递给成员对象之前验证它

时间:2015-12-23 14:25:26

标签: c++

我想写一个使用另一个类( Class1 )的类( Class2 )。

  • Class1 需要2个参数(第2个参数始终相同,所以不需要谈论它。)
  • Class2 需要1个参数,我想检查此参数是否有效,然后再将其传递给从 Class1
  • 创建的对象

所以我的代码看起来像这样:

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>

2 个答案:

答案 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");
}