クラス内のベクトルによるスコープの問題

#include 
#include 
#include 
#include 

using namespace std;

class Dict
{
public:
    string line;
    int wordcount;
    string word;
    vector words;
    Dict(string f)
    {
        ifstream myFile;
        myFile.open(f.c_str());
        if (myFile.is_open())
        {
            while(!myFile.eof())
            {
                myFile >> word;
                words.push_back(word);
            }
            cout << endl << "Wordcount: " << wordcount << endl;
        }
        else
            cout << "ERROR couldn't open file" << endl;
        myFile.close();
    }
};

int main()
{
    Dict d("test.txt");
    cout << words.size() << endl;
    return 0;
}

単語のベクトルがmain()で宣言されていないというエラーが出ます。

私はすでにクラスで定義しているので、これをコンパイラに見えるようにするにはどうすればいいですか?オブジェクトがインスタンス化され、コンストラクタが呼び出されると、単語ベクタは作成されるべきではありませんか?しかし、コンパイラはこれに気付かない。

どうすればこの問題を解決できますか?

0

3 答え

words is a member in your Dict object d:

int main() {
    Dict d("test.txt");
    cout << d.words.size();
    return 0;
}
4
追加された
^^私は馬鹿だと感じる。
追加された 著者 CyberShot,

あなたは words の独自のインスタンスを持つ、そのクラスのいくつかのオブジェクトを持つことができるので、コンパイラはどのような意味を持つのでしょうか?

コンパイラにその単語を見つける場所を教えてください:

cout << d.words.size();
1
追加された

単語d のメンバーであるため、 d.words を使用する必要があります。

クラスでは、変数または関数の各メンバーはオブジェクトに属します。 2つのオブジェクトがある場合:

Dict d1("text1.txt");
Dict d2("text1.txt");

d1 または d2words を意味する場合、コンパイラは words それを伝えます。あなたが言う方法は、オブジェクト名の後にを続けてメンバー名を付けることです。

つまり、 d1.wordsd2.words は2つの異なるベクトルです。

0
追加された