2016-04-07 4 views
0

Ich habe eine sehr allgemeine Frage bezüglich des folgenden Fehlers und ich danke im Voraus für jeden hilfreichen Kommentar. Ich habe meine Codierung vereinfacht, um auf den Fehler hinzuweisen, den ich erhalten habe. (Ich habe einen Fehler, wenn ich versuche, auf Objekt und Variablen der Elternklasse innerhalb der Unterklasse Mitglied Funktion zuzugreifen. Ich schrieb die Zusammenfassung des Fehlers in den Kommentar) Angenommen, ich habe den folgenden Code.Vererbung mit Vorlage (Zugreifen auf Variable und Objekt der Elternklasse innerhalb der Unterklassenmitgliedsfunktion)

//here is the parent class 
template<class T, int m, int n> 
class A{ 
protected: 
    vector<vector<T>> elements; 
    int nrow; 
    int ncol; 
public: 
    A(); 
} 

A<T,m,n>::A():nrow(m),ncol(n){ 
    for (int i = 0; i < nrow; i++){ 
    vector<T> row(ncol, 0); 
    elements.push_back(row); 
}//this is a constructor to assign MxN zero matrix 

//here is the child class and member function assign() and pow() 
template<class T, int n> 
class B:public A<T,n,n>{ 
    B(); 
    B<T,n> assign(); 
} 

template<class T, int n> 
B<T, n>::B() : A<T, n, n>(){}//a constructor of child class for NxN square matrix 

template<class T, int n> 
B<T,n> B<T,n>::assign(){ 
    A<T,n,2*n> a; 
    for (int i = 0; i < nrow; ++i){ 
     for (int j = 0; j < ncol; ++j){ 
     //this causes error saying that "Error 1 error C2248:'A<T,3,3>::elements' : cannot access protected member declared in class 'A<T,3,3>'" 
     a.elements[i][j] = elements[i][j]; 
    } 
} 
    b.elements[0][0] = a.elements[0][0]; 
    return b; 
} 

Wenn meine Codierung nicht ausreichend ist, meine Frage zu beantworten. Ich kann alle Details zur Verfügung stellen. Mein oberstes Ziel ist es, Nx2N matrix.a zu machen und die Elemente der NxN-Matrix in die linke Hälfte von matrix.a einzufügen und einige Berechnungen innerhalb der Elementfunktion assign() durchzuführen. (Oder ist das überhaupt möglich ?????) In main.cpp habe ich 3x3-Matrix aufgerufen.

Antwort

1

Sie haben Ihre Programmierung nicht weit genug vereinfacht.

class A { 

protected: 

    int n=0; 
}; 

class B : public A { 

public: 

    B() 
    { 
     n=4; 

     A a; 

     a.n=n; 
    } 
}; 

Dies führt in der gleichen Übersetzungsfehler als komplizierte Template-Code: Sie können Ihre Übersetzungsfehler mit einem viel kürzeren Beispiel trivialer reproduzieren.

Es stimmt, dass A seine Mitglieder als geschützte Zugriffsklasse verfügbar macht. All dies bedeutet, dass die Unterklasse B, die von A erbt, Zugriff auf die geschützten Variablen der Superklasse hat. Dies bedeutet jedoch nicht, dass die Unterklasse B auf andere geschützte Variablen der Instanz A zugreifen kann.

Dies ist Ihr grundlegendes Problem. Es hat nicht wirklich mit den spezifischen Details deiner Matrixmanipulationen zu tun oder irgendetwas damit zu tun. Es kommt darauf an, wie Vererbung und öffentlicher/geschützter/privater Zugriff funktioniert. Sie müssen nur Ihre Klassen neu gestalten, damit Sie das implementieren können, was Sie erreichen möchten.

Und dies ist ein weiteres Beispiel für die Fehlermeldung von GCC, die viel lesbarer ist als der Compiler von Microsoft (wie Sie es zu verwenden scheinen). Vergleichen gcc ist leicht zu verstehen, Diagnose:

t.C: In constructor ‘B::B()’: 
t.C:5:8: error: ‘int A::n’ is protected 
    int n=0; 
     ^
t.C:18:5: error: within this context 
    a.n=n; 
    ^

mit der kryptischen Diagnose von Ihrem Compiler. Der Teil "in diesem Zusammenhang" weist eindeutig nicht nur auf die beanstandende Aussage hin, sondern auf die spezifische Referenz "a.n", das ist das Problem.

+0

Vielen Dank für den Kommentar !! Um das Problem zu beheben, habe ich die gesamte Klassenstruktur neu gestaltet? Gibt es einen Weg, mein Ziel mit der Vererbung zu erreichen? – SungwonAhn

+0

"Redesign" bedeutet nicht "Vererbung nicht verwenden". Sie müssen lediglich zusätzliche Methoden in der Oberklasse und der Unterklasse mit geeigneten Zugriffsebenen definieren und implementieren, mit denen Sie das tun können, was Sie tun möchten. –

Verwandte Themen