我尝试构建一个类似于STL中定义的基本字符串类,但是使用一种方法来处理拆分操作。这是代码:
//The header file "splitstring.h" for the interface
class ISplittable
{
public:
virtual std::vector<std::string> &split(char delim, bool rep = false) = 0;
};
class SplitString : public std::string, public ISplittable
{
public:
SplitString() : std::string() {}
SplitString(char *str) : std::string(str) {}
std::vector<std::string> &split(char delim, bool rep = false);
private:
std::vector<std::string> fields;
};
//The CPP file that provides the implementantion
#include "splitstring.h"
#include <string>
#include <vector>
std::vector<std::string> &SplitString::split(char delim, bool rep)
{
if(!fields.empty()) fields.clear(); //clear the vector if it's needed.
std::string work = this->data(); //save the original string in a temp variable.
std::string buf = ""; //buf serves as an accumulator to work with each token separately.
int i = 0;
while(i < work.length()) { //split the original string into tokens and pushes them back in the vector.
if(work[i] != delim)
buf += work[i];
else if(rep == 1) {
fields.push_back(buf);
buf = "";
} else if(buf.length() > 0) {
fields.push_back(buf);
buf = "";
}
i++;
}
if(!buf.empty())
fields.push_back(buf);
return fields;
}
ISplittable 接口提供了 split 方法,该方法采用分隔符(应该拆分字符串的字符)和布尔参数,该参数指定拆分操作应该重复多次;默认情况下, rep 参数设置为 false 。
SplitString 类继承自STL 字符串类和 ISplittable 接口。它实现了在 ISplittable 中定义的 split 方法。它还有字段属性,它是 string 类型的向量,它用于存储已获取的每个标记在拆分操作之后: split 方法返回对此向量的引用。
在 main.cpp 文件中,我只是尝试创建 SplitString 类的实例并调用其 split 方法:
//The main.cpp file
#include "splitstring.h"
#include <iostream>
using namespace std;
int main()
{
SplitString str = "Lorem ipsum dolor sit amet";
cout << str << endl;
vector<string> fld = str.split(' '); //Splits the string at every space.
for(int i = 0; i < fld.size(); i++)
cout << fld[i] << endl;
cin.get();
return 0;
}
但是当我尝试编译代码时,g ++告诉我:
在文件splitstring.h中
无效使用&#39; ::&#39; (第4行)
ISO C ++禁止声明&#39; vector&#39;没有类型(第4行)
&#39;矢量&#39;宣称为虚拟&#39; field (第4行)
预期&#39;;&#39;之前&#39;&lt;&#39;令牌(第4行)
预期的类名称是&#39;,&#39;令牌(第7行)
类成员范围内非成员的使用声明(第13行)
在构造函数&#39; SplitString :: SplitString()&#39;
中&#39;之前的预期班级名称(&#39;令牌(第10行)
在构造函数&#39; SplitString :: SplitString(char * str)&#39;
&#39;之前的预期班级名称(&#39;令牌(第11行)
在&#39; main.cpp&#39;
class&#39; SplitString&#39;没有名为&#39; split&#39; (第11行)
我在网站上搜索过类似的问题,但没有找到任何可以满足我需求的东西。 我真的无法看到问题所在。根据错误消息,我猜有某种错误与范围有关。如果你们中的任何人能告诉我这段代码有什么问题以及如何修复它,我将不胜感激。
答案 0 :(得分:0)
尝试将这些行从splitstring.cpp
移至splitstring.h
:
#include <string>
#include <vector>
此编译器输出的原因:
Invalid use of '::' (line 4)
ISO C++ forbids declaration of 'vector' with no type (line 4)
是编译器没有&#34;&#34;看&#34;解析头文件时头文件string
和vector
。因此,它没有看到std
命名空间和类vector
和string
的声明。
答案 1 :(得分:0)
您忘记在标头文件<vector>
中至少包含标题"stringsplit.h"
。所以编译器会发出错误,因为它不知道什么是vector。
考虑到字符串文字具有常量数组的类型。所以不是构造函数
SplitString(char *str) : std::string(str) {}
你shpuld声明
SplitString(const char *str) : std::string(str) {}
如果你打算使用字符串文字。
声明数据成员
也没有任何意义std::vector<std::string> fields;
因为它只用于函数拆分的返回对象,每次调用函数时都会被删除。
如果你只是定义一个分割字符串的非类函数会更好。