2017-05-19 8 views
-1

現在、小さなコンソールアプリケーションで作業していますが、いくつかのファイルから読み込みました。ファイル読み込みの進行状況を示す簡単なアニメーション読み込みバースレッドを作成しました。巨大な)Visual Studio 2015 C2011 'クラス'型の再定義

私は、Microsoftのドキュメントとフォーラムで読んだとそのエラーは、私がクラスを複数定義したことを示唆しているようです。

しかし、私はこれを防ぐためにすべてのヘッダーブロックを含んでいました。皆さんは間違いなく私の間違いを見ています。ここで

コード

fileReader.h

#pragma once 
#ifndef FILEREADER_H // must be unique name in the project 
#define FILEREADER_H 

#include <vector> 

using namespace std; 

class fileReader { 

private: 

public: 
    vector<string> readTextFile(string path); 
    unsigned int getSize(); 
    unsigned int getLoadedBytes(); 
}; 
#endif  // FILEREADER_H 
#pragma once 

fileReader.cpp

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <thread> 

#include "numbers.h" 
#include "loadingBar.h" 


using namespace std; 

class fileReader { 
private: 

public : 
    vector<string> list; 
    int i; 
    unsigned int size; 
    unsigned int loadedBytes; 
    string line; 
    std::thread* barThread; 

    vector<string> fileReader::readTextFile(string path) { 

     ifstream file(path.c_str(), ios::in | ios::binary | ios::ate); 

     i = 0; 
     size = 0; 
     loadedBytes = 0; 

     ifstream file(path.c_str(), ios::in | ios::binary | ios::ate); 

     if (file.is_open()) { 
      size = file.tellg(); 
      cout << "\t" << path << " (" << formatNumbers(size) << " bytes)" << endl; 
      file.clear(); 
      file.seekg(0, ios::beg); 

      barThread = new std::thread(&loadingBar::run, *this); 

      while (file >> line) { 
       list.push_back(line); 
       loadedBytes += strlen(line.c_str()); 
       i++; 
      } 

     } 
     else { 
      cout << "Error reading : \"" << path << "\"" << endl; 
      exit(EXIT_FAILURE); 
     } 
     file.close(); 
     return list; 
    } 

    unsigned int fileReader::getSize() { return size; } 
    unsigned int fileReader::getLoadedBytes() { return loadedBytes; } 

}; 

loadingBar.h

#pragma once 
#ifndef LOADINGBAR_H 
#define LOADINGBAR_H 

#include<stdlib.h> 
#include<string> 
#include<iomanip> 
#include "numbers.h" 
#include "fileReader.h" 

using namespace std; 

class loadingBar { 
public: 
    void notififyFinish(); 
    void notifyError(); 
    void notifiError(string); 
    void drawloadingBar(); 
    void drawPathBar(); 
    void drawBytesBar(); 
    void setLoadedUnits(int); 
    void setTotalUnits(int); 
    void run(fileReader*); 

}; 

#endif // NUMBERS_H 

loadingBar.cpp

であります
#include "stdafx.h" 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
#include <string> 
#include <iomanip> 

#include "numbers.h" 
#include "fileReader.h" 

using namespace std; 

class loadingBar { 

private: 

public: 

    double totalUnits = 1; 
    double loadedUnits = 0; 
    char loadedChar = '/'; 
    char emptyChar = ' '; 
    int barLength = 50; 
    double percent; 
    int nbChar; 

    void notiftyFinish() { 
     cout << " Ok" << endl; 
     //exit(EXIT_SUCCESS); 
    } 

    void notifiyError() { 
     cout << " Error !" << endl; 
     //exit(EXIT_FAILURE); 
    } 

    void notifiyError(string errMess) { 
     cout << " Error !" << endl << "\t" << errMess; 
     //exit(EXIT_FAILURE); 
    } 

    void drawLoadingBar() { 
     cout << fixed; 

     cout << "\rLoading ["; 

     for (int i = 0; i < nbChar; i++) 
      cout << loadedChar; 

     for (int i = nbChar; i < barLength - 1; i++) 
      cout << emptyChar; 

     cout << "] " << setprecision(0) << percent << "%"; 
    } 

    void drawPathBar(string path) { 
     cout << fixed; 

     cout << "\rLoading [ "; 

     cout << path; 

     cout << " ] " << setprecision(0) << percent << "%"; 
    } 

    void drawBytesBar() { 
     cout << fixed; 

     cout << "\rLoading [ "; 

     cout << formatNumbers(loadedUnits) << "/" << formatNumbers(totalUnits); 

     cout << " ] " << setprecision(0) << percent << "%"; 
    } 

    void setLoadedUnits(int newValue) { 
     if (newValue > 0) 
      loadedUnits = newValue; 
    } 

    void setTotalUnits(int value) { 
     if (value > 0) 
      totalUnits = value; 
    } 

    void run(fileReader *f) { 
     setTotalUnits(f->getSize()); 
     setLoadedUnits(f->getLoadedBytes()); 

     while (loadedUnits <= totalUnits) { 
      setLoadedUnits(f->getLoadedBytes()); 
      percent = ((double)(loadedUnits/totalUnits) * 100); 
      nbChar = (int)(percent/(int)(100/barLength)); 

      drawLoadingBar(); 

      //setLoadedUnits((int)loadedUnits + 10); 

      if (loadedUnits >= totalUnits) notiftyFinish(); 
     } 
    } 
}; 
+3

実装ファイルでクラスを再宣言しますか?そのエラーメッセージについて実際には何が分かりませんか?特にヘッダファイルで 'namespace std;'を使うのを止めてください。私はそれが最後に重複した質問であると確信しています。ちょうど今検索するのが怠惰です(あなたの責任はまったくありません)。 –

+2

あなたはボットのヘッダーとCPPでクラスを宣言しています。だからこそあなたは誤りを得る。実装がCPPファイルでどのように行われているかを確認してください。 'class ... 'は必要なく、すべてのメンバ変数がヘッダに必要です。 –

答えて

0

.cppファイルによってクラスが再定義されます。すでにそれぞれの.hファイルに定義済みです。 .cppファイルに含める必要があるのは実装だけです。 loadingBar.cppための同様

fileReader.cpp

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <thread> 

#include "numbers.h" 
#include "loadingBar.h" 

vector<string> fileReader::readTextFile(string path) { 

    ifstream file(path.c_str(), ios::in | ios::binary | ios::ate); 

    i = 0; 
    size = 0; 
    loadedBytes = 0; 

    ifstream file(path.c_str(), ios::in | ios::binary | ios::ate); 

    if (file.is_open()) { 
     size = file.tellg(); 
     cout << "\t" << path << " (" << formatNumbers(size) << " bytes)" << endl; 
     file.clear(); 
     file.seekg(0, ios::beg); 

     barThread = new std::thread(&loadingBar::run, *this); 

     while (file >> line) { 
      list.push_back(line); 
      loadedBytes += strlen(line.c_str()); 
      i++; 
     } 

    } 
    else { 
     cout << "Error reading : \"" << path << "\"" << endl; 
     exit(EXIT_FAILURE); 
    } 
    file.close(); 
    return list; 
} 

unsigned int fileReader::getSize() { return size; } 
unsigned int fileReader::getLoadedBytes() { return loadedBytes; } 

:彼らはより次のようになります。

関連する問題