2016-04-13 9 views
1

Ich bin ziemlich neu in C++ und versuche derzeit, Vorlagen zu lernen und wie sie funktionieren. Meine Aufgabe fordert mich auf, eine Elternklasse, Basis, zu erstellen, die 4 Argumente in eine Vorlage aufnimmt. Außerdem muss eine Unterklasse vorhanden sein, die die Werte der Basisklasse ausgeben kann.Fehler C2248, was ist dieser Fehler und wie behebe ich es?

Die Elternklasse erhält die Werte durch Lesen einer TXT-Datei.

Jetzt versuche ich eine Unterklasse zu instanziieren, so dass ich die Werte Zeile für Zeile in der Elternklasse drucken kann.

Mein Code ist chaotisch, da ich in C++ sehr neu bin. Mein Hintergrund besteht aus C#, Java und Javascript. Jede Hilfe wäre fantastisch! Danke im Voraus.

Fehlermeldung:

Error 1 error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>' 

Code:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <iomanip> 
#include <algorithm> 
#include <cctype> 

using namespace std; 

//template that accept 4 different data types 
template<class Type1, class Type2, class Type3, class Type4> 
class Base { 
    //protected declarations 
    protected: 
     Type1 str; 
     Type2 i; 
     Type3 d; 
     Type4 b; 

    //public declarations 
    public: 
     int lineRead; 
     int data; 
     string line, delimiter; 
     size_t pos; 
     ifstream inputfile; 
     string token; 

    //public functions 
    public: 
     void readFile(int lineNum) { 
      //temp information holders 
      lineRead = 0; 
      pos = 0; 
      delimiter = " "; 

      //open .txt file 
      inputfile.open("file.txt"); 

      //while end of file is not reached 
      while (!inputfile.eof()) { 
       //increment line counter 
       lineRead++; 

       //read line 
       getline(inputfile,line); 

       //if this is the line requested fill the template members with the 
       //correct data. <string, int, double, bool> 
       if(lineNum == lineRead){ 
        //getting the string 
        pos = line.find(delimiter); 
        token = line.substr(0, pos); 
        str = token; 
        line.erase(0, pos + delimiter.length()); 

        //getting the integer 
        pos = line.find(delimiter); 
        token = line.substr(0, pos); 
        i = stoi(token); 
        line.erase(0, pos + delimiter.length()); 

        //getting the double 
        pos = line.find(delimiter); 
        token = line.substr(0, pos); 
        d = stod(token); 
        line.erase(0, pos + delimiter.length()); 

        //getting the boolean 
        pos = line.find(delimiter); 
        token = line.substr(0, pos); 
        b = to_bool(token); 
        line.erase(0, pos + delimiter.length()); 
       } 
      } 

      //close the file 
      inputfile.close(); 
      system("pause"); 
     }; 

     //Changes a string to lower case and then reads the string 
     //to find if the value is true or false. Returns a boolean. 
     bool to_bool(string str) { 
      transform(str.begin(), str.end(), str.begin(), ::tolower); 
      istringstream is(str); 
      bool tempB; 
      is >> boolalpha >> tempB; 
      return tempB; 
     } 
}; 

class Subclass : public Base<string, int, double, bool> { 
    private: 
     string name; 

    public: 
     Subclass::Subclass(string name) { 
      cout << "test"; 
     } 

     void printValues() { 
      cout << str; 
     } 


}; 

//main function 
int main() { 
    //call Base class and give the template data types 
    Subclass b = Subclass("test"); 

    //read the file 
    b.readFile(2); 

    return 0; 
} 

Antwort

1
Subclass b = Subclass("test"); 

Dies erstellt ein Objekt und versucht dann, es zu kopieren. Ihre Klasse ist nicht kopierbar, daher der Fehler (auch das Kopieren abgeleiteter Klassen ist problematic auf ihre eigene Art). Verwenden Sie die folgende Syntax, um ein Objekt ohne Kopieren zu erstellen:

Subclass b("test"); 
+0

Einfacher Fehler, danke für das Aufzeigen meiner Dummheit! :) –

0

Sie haben eine std::ifstream als Mitglied, aber sie sind nicht kopierbar, daher hte Fehlermeldung Sie zitiert. Pre-C++ 11, die idiomatische Methode, etwas nicht kopierbar zu machen, bestand darin, seinen Kopierkonstruktor mit einem privaten Zugriffsspezifizierer zu deklarieren (was man sieht), so dass niemand ihn versehentlich benutzen konnte. In C++ 11 wird das Schlüsselwort delete bevorzugt, und Sie erhalten einen Fehler nach dem Muster "Verwendung der gelöschten Funktion".

Sie sollten entweder:

  1. einen Kopierkonstruktor definieren und kopieren Zuweisungsoperator
  2. Nicht eine nicht kopierbare Mitglied

Ich würde mit (2) wenn ich du wäre; Fragen Sie sich, warum Sie dies als Mitglied benötigen und finden Sie dann einen Weg, es auszumachen.