2016-07-22 124 views
0

你好球員在我的C++程序我有四個類(A,B,C,d)模板指針C++數組?

  • A是基類
  • 乙從A
  • Ç繼承甲
  • d繼承的B

他們都繼承是模板類template<class Type>和他們每個人都有,它打印的私有成員,它繼承的類的私有成員的打印方法。所以B會打印B私人成員和私人成員,C會打印C私人成員和私人成員,D會打印它的私人成員和B,私人成員。

在主函數中,我想爲每個類的對象有3個位置的類A創建一個指針數組,然後我想循環每個對象的打印方法。

問題是當我將類更改爲模板類時出現錯誤消息,說「我的類沒有構造函數」;但是他們確實有他們。

這裏是我的代碼請幫助(注意我評論的地方發生的錯誤你):

#include <iostream> 
#include <string> 
using namespace std; 

template <class Type> 
class A 
{ 
public: 
virtual void print() 
{ 
    cout<<"the base class (A) private (x) is : "<<x<<endl; 
} 

A(Type X = 0) 
{ 
    x = X; 
} 
void setX(Type X) 
{ 
    x = X; 
} 

Type getX() const 
{ 
    return x; 
} 

private: 
Type x; 
}; 


template <class Type> 
class B:public A 
{ 
public: 
B(Type X = 0,Type Y = 0) 
{ 
    setX(X); 
    y = Y; 
} 
void setY(Type Y) 
{ 
    y = Y; 
} 

Type getY() const 
{ 
    return y; 
} 

void print() 
{ 
    A::print(); 

    cout<<"private (y) in class (B) is : "<<getY()<<endl; 
} 

private: 
Type y; 
}; 

template <class Type> 
class C:public A 
{ 
public: 
C(Type X = 0,Type Z = 0) 
{ 
    setX(X); 
    z = Z; 
} 
void setZ(Type Z) 
{ 
    z = Z; 
} 

Type getZ() const 
{ 
    return z; 
} 

void print() 
{ 
    A::print(); 

    cout<<"private (z) in class (C) is : "<<getZ()<<endl<<endl; 
} 

private: 
Type z; 
}; 


template <class Type> 
class D:public B 
{ 
public: 
D(Type X = 0,Type Y = 0,Type W = 0) 
{ 
    setX(X); 
    setY(Y); 
    w = W; 
} 
void setW(Type W) 
{ 
    w = W; 
} 

Type getW() const 
{ 
    return w; 
} 

void print() 
{ 
    B::print(); 

    cout<<"private (w) in class (D) is : "<<getW()<<endl; 
} 

private: 
Type w; 
}; 


void main() 
{ 
A<int>* arrayOfPointers[3]; 

arrayOfPointers[0] = new B(1,100);//error here 
arrayOfPointers[1] = new C(2,200);//error here 
arrayOfPointers[2] = new D(3,300,3000);//error here 

for(int i = 0 ; i<3;i++) 
{ 
    cout<<typeid(*arrayOfPointers[i]).name()<<" Print method : \n"<<endl; 
    arrayOfPointers[i]->print(); 
    cout<<"**********************\n"<<endl; 
} 

} 
+1

在SO上發佈時,嘗試拿出仍然顯示錯誤的最小示例,並提供確切的錯誤消息。你可能只需要A和B在這裏產生錯誤,所以你可以減少一半的代碼。 –

+2

在'B類:公共A''你從什麼'A'繼承?由於'A'是一個模板,它的名字是不夠的。 – NathanOliver

+2

我覺得'所有這些都是模板課程'都是你所面臨的誤解的表現。他們是班級模板。這意味着如果你有'template class A'那麼'A'本身不是一個類。只有你指定了所有的模板參數,它纔會成爲一個真正的類。所以'A '就是一個例子。 – PeterT

回答

1

你忘了兩件事情:

1)你的產業,需要爲他們繼承類指定模板參數。例如:

template <class Type> 
class B : public A<Type> 
{ 
    ... 
} 

2)當你實例化你的類,你需要提供模板參數,也:

arrayOfPointers[0] = new B<int>(1, 100); 
arrayOfPointers[1] = new C<int>(2, 200); 
arrayOfPointers[2] = new D<int>(3, 300, 3000); 

但是,您也可以提供模板函數來從提供的這些類別實例參數,像那些使從STD庫_(...)方法:

template <class Type> 
B<Type>* create_B(const Type& t1, const Type& t2) 
{ 
    return new B<Type>(t1, t2); 
} 

,並使用它像這樣:

arrayOfPointers[0] = create_B(1, 100); 

但是,要知道,這些方法是創建到分配的堆內存的原始指針,所以你有責任刪除它(您可以使用shared_ptrs或任何克服或只返回一個對象等,但事實並非部分你的問題/我的答案)。

0

您從A繼承,但你應該從具體的實例A<T>繼承。也許class B:public A<Type>

+1

對於1)'A(類型X = 0)'是默認構造函數的有效替代。至於3)他已經有了一系列的指針 – PeterT

+0

對,刪除了第一個(我已經注意到並刪除了第三個) – Dutow