我想扩展std :: string,但不是你想的原因

时间:2010-03-18 20:17:44

标签: c++ typedef explicit

我有一个有效地接受字符串的方法。但是,我想要使用的字符串子集非常有限。我想把typedef'ing std :: string作为一些类,并将函数调用为显式。但是,我不确定这是否会奏效。想法?

3 个答案:

答案 0 :(得分:8)

通常的规则仍然适用:该类不是为了继承而设计的,并且它的析构函数不是虚拟的,所以如果你向上转换到std :: string基类,并让对象被销毁,你的派生类'析构函数不会被调用。

如果您能保证永远不会发生这种情况,请继续。

否则,您可以使std::string成为您的类的成员,而不是基类。或者你可以使用私有继承。这种方法的问题在于您必须重新实现该类的字符串接口才能用作字符串。

或者你可以定义你的类来公开一个返回内部getString()对象的std::string函数。然后您仍然可以传递自己的类,如果您尝试传递std::string,编译器会抱怨,但是在您需要时可以访问内部字符串。这可能是最好的妥协。

答案 1 :(得分:7)

听起来你想限制输入(也许是一个只允许字母的字符串)。

我建议在一个类中使用一个字符串,然后包装你想要的函数。

class limited_string
{
    std::string str;

public:
    limited_string(const char *data)
        : str(data)
    {
        if (!valid(str))
            throw std::runtime_exception(); 
    }

    virtual ~limited_string() {}

    limited_string &operator+=(const char *data)
    {
        // do all your work on the side - this way you don't have to rollback
        // if the newly created string is invalid
        std::string newstr(str);
        newstr += data;
        if (!valid(newstr))
            throw std::runtime_exception();

        str = newstr;
    }

    virtual bool valid(const std::string str) = 0;
}

答案 2 :(得分:0)

听起来你有一个接受限制字符串的一个方法。真的有必要上新课吗?

void needs_restricted_string( std::string const &str ) {
    if ( ! is_restricted_string( str ) ) throw std::runtime_error( "bad str" );
    …
}

否则,您唯一想要捕获的是字符串是否满足限制。我在is_restricted_string()和编译时类之间看到的唯一区别是性能,如果您有一个专用于检查字符串的存储结构。不要过早优化。也就是说,将新功能放入新类或将其用作字符串也是错误的。

class restricted_string {
    std::string storage;
public:
     // constructor may implement move or swap() semantics for performance
     // it throws if string is no good
     // not explicit, may be called for implicit conversion
    restricted_string( std::string const & ) throw runtime_error;
     // getter should perhaps be private with needs_restricted as friend
    std::string const &str() const { return storage; }
}; // and no more functionality than that!

void needs_restricted_string( restricted_string const &str ) {
    std::string const &known_restricted = str.str();
}

std::string mystr( "hello" );
needs_restricted_string( mystr );