C++11 如何通过重载*运算符连接字符串,如果将整数N与字符串S相乘,则应将S连接N次

C++11 如何通过重载*运算符连接字符串,如果将整数N与字符串S相乘,则应将S连接N次,c++11,C++11,对于Value类中的所有类型,我必须为乘法创建一个重载运算符。但是我不确定我应该如何编写代码来将一个字符串(比如S)与一个整数(比如N)相乘,其中返回的是串接N次的字符串S。这就是我所拥有的: enum Type { INTEGERVAL, FLOATVAL, STRINGVAL, UNKNOWNVAL, }; class Value { int i; float f; string s; Type t; public: Value(int i) : i(i), f(0), t(INTEGER

对于Value类中的所有类型,我必须为乘法创建一个重载运算符。但是我不确定我应该如何编写代码来将一个字符串(比如S)与一个整数(比如N)相乘,其中返回的是串接N次的字符串S。这就是我所拥有的:

enum Type {
INTEGERVAL,
FLOATVAL,
STRINGVAL,
UNKNOWNVAL,
};

class Value {
int i;
float f;
string s;
Type t;
public:
Value(int i) : i(i), f(0), t(INTEGERVAL) {}
Value(float f) : i(0), f(f), t(FLOATVAL) {}
Value(string s) : i(0), f(0), s(s), t(STRINGVAL) {}

Type GetType() { return t; }
int GetIntValue();
float GetFloatValue();
string GetStringValue();


Value operator*(const Value& op) const
{
    if (t == INTEGERVAL)
    {
        // I can multiply with another integer or float
        if (op.t == INTEGERVAL)
            return Value(i * op.i);
        else if (op.t == FLOATVAL)
            return Value(i * op.f);
    }
    else if (t == FLOATVAL)
    {
        // I can multiply with another integer or float
        if (op.t == INTEGERVAL)
            return Value(f * op.i);
        else if (op.t == FLOATVAL)
            return Value(f * op.f);
    }
    else if (t == STRINGVAL)
    {
        if (op.t == INTEGERVAL)
        {
            //I can concatenate a string times the value of the integer

            //Not sure how to do it//
            return Value(); //I don't know what the return should be//
        }
    }
    return Value(); // invalid!
}
};
我真的很感激你能给我一些指导,告诉我该怎么做。 请告诉我是否需要提供有关此代码的任何其他信息,或者是否需要以更好的方式陈述我的问题=)


谢谢大家!

您可以使用临时字符串和
进行循环

假设您在
i
中存储了整数值,并且希望连接
op.s

else if (t == STRINGVAL)
    {
        if (op.t == INTEGERVAL)
        {
            string temp;  //Create a temporary string
            //Optional but would be useful for reallocating
            temp.reserve(op.s.length()*i);
            for(int j=0;j<i;j++)  //Assuming " i " has the count
                temp += op.s;     //This will concatenate

            return Value(temp);  //Pass the newly created string 
        }
    }
else if(t==STRINGVAL)
{
if(op.t==INTEGERVAL)
{
string temp;//创建一个临时字符串
//可选,但对重新分配有用
温度储备(操作s.长度()*i);

对于(int j=0;jnobody知道字符串是如何存储在
类中的。您是否有
std::string
成员?一个
char*
?其他形式的字符串?一般来说,找到字符串操作数的长度,乘以整数就可以找到结果的长度。分配/预保留空间,然后执行string多次将其复制到输出字符串中。谢谢@BenVoigt。我真的很感谢您的回答。我包含了适用于此问题的Value类的部分。既然包含了Value类,您所说的仍然有效吗?当然:预分配看起来像
v.s.reserve(s.size()*op.I)
并且副本看起来像
v.s.append
(执行
op.i
次)非常感谢@BenVoigt感谢@Sniper似乎工作得很好!最好提前预留空间,因为你知道需要多少空间。@BenVoigt我同意,但根据
操作符+=
for string,通过在当前字符串末尾添加额外字符来扩展字符串value@Sniper:是的,b但这意味着字符串在内部可能需要重新分配和复制多达N次。最好执行
temp.reserve(s.size()*op.i)
预先分配,一次分配,除了必要的拷贝之外,没有额外的拷贝。这并不是说如果没有保留,append将无法工作,而是保留会阻止您分配超过必要的内存。如果行为是每次将大小增加一倍,那么这可能是一个很大的数量。