2016-04-07 11 views
0

私は以下のエラーに関する非常に一般的な質問があります。私は受け取ったエラーを指摘するためにコーディングを簡略化しました。 (サブクラスメンバ関数内の親クラスのオブジェクトと変数にアクセスしようとするとエラーが出ます。コメントにエラーの概要を書きました)次のコードがあるとします。テンプレートによる継承(サブクラスメンバー関数内で親クラスの変数とオブジェクトにアクセス)

//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; 
} 

私のコーディングが私の質問に答えるのに十分でない場合。私は完全な詳細を提供することができます。最終的な目標は、Nx2N matrix.aを作成し、NxNマトリックスの要素をmatrix.aの左半分に配置し、メンバー関数assign()内で計算を行うことです。 (またはそれも可能ですか?????)main.cppでは、私は3x3行列を呼び出しました。

答えて

1

あなたは「あなたのコーディングを簡素化」していませんでした。あなたは自明はるかに短い例を使ってコンパイルエラーを再現することができます

class A { 

protected: 

    int n=0; 
}; 

class B : public A { 

public: 

    B() 
    { 
     n=4; 

     A a; 

     a.n=n; 
    } 
}; 

これはあなたの複雑なテンプレートコードと同じコンパイルエラーになります。

Aは、メンバーを保護されたアクセスクラスとして利用できることは事実です。これは、Aから継承したサブクラスBがそのスーパークラスの保護された変数にアクセスできることを意味します。しかし、サブクラスBが別のAインスタンスの保護された変数にアクセスできるということではありません。

これはあなたの根本的な問題です。実際には、行列操作の具体的な詳細やそれに関連するものとは関係ありません。継承、公開/保護/非公開アクセスが機能するようになります。達成しようとしていることを実装できるようにするには、クラスを再設計するだけです。

これは、gccのエラーメッセージがMicrosoftのコンパイラよりもはるかに読みやすくなっているもう1つの例です(使用しているようです)。 gccの診断結果を簡単に比較して比較する:

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; 
    ^

あなたのコンパイラの潜在的な診断を使ってください。 「この文脈の中で」の部分は、問題の声明だけでなく、特定の言及「a.n」を明らかに指摘している。

+0

コメントありがとうございます!だから問題を解決するために、私はクラス構造全体を再設計していますか?継承で私の目標を達成する方法はありますか? – SungwonAhn

+0

"Redesign"は "継承を使用しない"という意味ではありません。スーパークラスとサブクラスに適切なアクセスレベルで追加のメソッドを定義して実装するだけで、実行することができるようになります。 –

関連する問題