我正在尝试读取文本文件“ dictionary.txt”,其中包含一些单词及其定义和类型。每个单词都应使用定义和类型加载到Word类对象中,然后将该对象推入其他Word对象的向量数组中。
但是我遇到了错误:
E0147 declaration is incompatible with "void Dictionary::loadDictionary(std::vector<<error-type> std::allocator<<error-type>>> &vect)" (declared at line 27)
和
E0020 identifier "loadDictionary" is undefined.
一般来说,我对C ++和OOP还是很陌生,所以希望他们对这些错误有所帮助。
感谢堆!
代码:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Dictionary
{
public:
void loadDictionary(vector<Word>& vect);
private:
Word w1;
string word;
string def;
string type;
};
void Dictionary::loadDictionary(vector<Word>& vect)
{
ifstream dicFile;
dicFile.open("dictionary.txt");
if (!dicFile)
{
cout << "File not found!" << endl;
exit(1);
}
int count1 = 0;
while (!dicFile.eof())
{
w1 = new Word;
dicFile >> word;
dicFile >> def;
dicFile >> type;
w1.word->word;
w1.def->def;
w1.type->type;
vect.push_back(w1);
}
}
class Word
{
public:
private:
string word;
string definition;
string type;
};
Word::Word() {
word = "";
definition = "";
type = "";
}
int main()
{
Dictionary d;
vector<Word> word;
d.loadDictionary(word);
return 0;
}
答案 0 :(得分:0)
如果将所有代码推送到单个文件,则只需创建一个Dictionary对象并调用函数loadDictionary()
字典d; d.loadDictionary(word);
答案 1 :(得分:0)
该代码需要完全修改。但是一些显而易见的快速修复方法:
答案 2 :(得分:0)
这里有一些建议,可以使一切正常运行并开始思考 以一种更加面向对象的方式解决问题(但这可能是主观的)。
正如其他人指出的那样,主要问题是w1
是一个单词,您尝试这样做
w1 = new Word;
这没有任何意义,因为new Word
创建了一个指向Word(a Word*
)的指针,
这不是你想要的。 C ++不是Java,在Java中,所有内容都是隐式的
指向某物的指针。在这里您可以拥有自动对象(Word)和指针
到对象(Word *)。
从类设计的角度来看,您将创建一个Word,该Word应该将这三个元素结合在一起
字符串word
,definition
和type
。好。什么是字典?顾名思义
它是单词的容器,因此向量应该是字典的属性,
而不是填充的参数。否则名称应为
DictionaryLoader或这些行中的内容。
因此,我将从修复Word类开始。为了简化起见,我建议您
一切都是公开的,因此我将使用struct
的{{1}} instad。以下
Google C++ Style Guide我
在成员变量名称之后添加了下划线。由于不需要初始化,
我会避免的。相反,您将从流中加载单词,所以这可能是一个好主意
有一个加载单词的方法。一个运算符会更好,但是让我们
留给未来。
您的阅读方式不允许包含空格的定义。因此,我自由使用了class
来使用带引号的字符串(里面没有引号!)。
这是一个示例getline
(您应该在问题中包括它!记住Minimal, Complete, and Verifiable example):
dictionary.txt
代码在这里。
sovereign "a king or queen" noun
desk "a type of table that you can work at, often one with drawers" noun
build "to make something by putting bricks or other materials together" verb
nice "pleasant, enjoyable, or satisfactory" adjective
现在是字典。字典是单词的容器,因此我们的字典应 里面有一个单词向量。词典中所有的变量 不在正确的地方。您将它们用作临时对象,因此它们应该 已放置在您的函数中。
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
struct Word {
std::string word_;
std::string definition_;
std::string type_;
std::istream& read(std::istream& is) {
is >> word_;
std::string skip;
std::getline(is, skip, '"');
std::getline(is, definition_, '"');
is >> type_;
return is;
}
};
检查struct Dictionary {
std::vector<Word> vect_;
bool load(const std::string& filename) {
std::ifstream is("dictionary.txt");
if (!is)
return false;
while (true) {
// Read
Word w;
w.read(is);
// Check
if (!is)
break;
// Use
vect_.push_back(w);
}
/* Alternative
Word w;
while (w.read(is)) { // Read & Check
// Use
vect_.push_back(w);
}*/
/* Another alternative
for (Word w; w.read(is);) { // Read & Check
// Use
vect_.push_back(w);
}*/
return true;
}
};
int main()
{
Dictionary d;
if (d.load("dictionary.txt"))
return EXIT_SUCCESS;
else
return EXIT_FAILURE;
}
功能。规则很简单:读取,检查,使用。我的建议是始终从包含三个注释的无限循环开始。然后添加相关代码以进行阅读,然后进行检查,最后使用您刚刚阅读的内容。如果确实需要,请寻找更紧凑的替代方案。
啊,我刚刚记得:由于您使用的是VisualStudio,请帮忙一个忙:不要使用预编译的头文件。您不知道它们是什么,并且相信我,很长一段时间都不会需要它们。因此,请使用“ Windows桌面向导”创建项目,不要为解决方案创建目录,然后在以下对话框中选择“空项目”。