Определение функций-членов класса, записанного в заголовочном файле, в отдельном файле .cpp на C ++ - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть 2 файла Article13Filter.h и Article.cpp, в которых я определяю все объявленные функции класса, расположенного в файле .h. Однако компилятор VS сообщает мне, что в файле Article13Filter.h слово Article13Filter, которое я пишу перед определением каждой функции (чтобы обозначить, что оно принадлежит этому классу), не является именем класса или пространства имен, даже если они include директивы правильно включены в соответствующие файлы? Я хотел бы спросить, почему это так?

Article13Filter.h file:

#ifndef ARTICLE_13_FILTER_H
#define ARTICLE_13_FILTER_H
#include <string>
#include <vector>
#include <set>
#include "Article.cpp"
class Article13Filter {
private:
    std::set<std::string> copyrighted;
    std::vector<std::string> blocked;
public:
    Article13Filter(std::set<std::string> copyrighted);
    bool blockIfCopyrighted(std::string s);
    bool isCopyrighted(std::string s);
    std::vector<std::string> getBlocked();
};
#endif // !ARTICLE_13_FILTER_H

Article .cpp файл:

#include <iostream>
#include <string>
#include <set>
#include "Article13Filter.h"
using namespace std;
bool Article13Filter::isCopyrighted(string s) {
    for (set<string>::iterator it = copyrighted.begin(); it != copyrighted.end(); it++) {
        if (*it == s) {
            return true;
        }
        return false;
    }
}
bool Article13Filter::blockIfCopyrighted(string s) {
    if (isCopyrighted(s)) {
        return false;
    }
    return true;
}
vector<string> Article13Filter::getBlocked() {
    return blocked;
}

1 Ответ

0 голосов
/ 04 ноября 2018

Удалить #include "Article.cpp" из Article13Filter.h. В общем случае вы хотите скомпилировать и связать файлы .cpp и включить файлы .h и .hpp.

Когда вы включаете файл, он эффективно копируется во включаемый файл. В конечном итоге компилируемый файл выглядит примерно так:

#include <iostream>
#include <string>
#include <set>

#include <string>
#include <vector>
#include <set>
#include <iostream>
#include <string>
#include <set>


using namespace std;
bool Article13Filter::isCopyrighted(string s) {
    for (set<string>::iterator it = copyrighted.begin(); it != copyrighted.end(); it++) {
        if (*it == s) {
            return true;
        }
        return false;
    }
}
bool Article13Filter::blockIfCopyrighted(string s) {
    if (isCopyrighted(s)) {
        return false;
    }
    return true;
}
vector<string> Article13Filter::getBlocked() {
    return blocked;
}

class Article13Filter {
private:
    std::set<std::string> copyrighted;
    std::vector<std::string> blocked;
public:
    Article13Filter(std::set<std::string> copyrighted);
    bool blockIfCopyrighted(std::string s);
    bool isCopyrighted(std::string s);
    std::vector<std::string> getBlocked();
};


using namespace std;
bool Article13Filter::isCopyrighted(string s) {
    for (set<string>::iterator it = copyrighted.begin(); it != copyrighted.end(); it++) {
        if (*it == s) {
            return true;
        }
        return false;
    }
}
bool Article13Filter::blockIfCopyrighted(string s) {
    if (isCopyrighted(s)) {
        return false;
    }
    return true;
}
vector<string> Article13Filter::getBlocked() {
    return blocked;
}

Ошибки, которые вы получаете, связаны с тем, что при включении файла cpp в файл .h, особенно перед определением класса, объявления методов класса видятся компилятором до того, как класс будет определен.

...