我只是在學習如何在 C 中使用模板,我有點掙扎。我在下面有一個例子,在我掛斷的地方有評論。
#include <iostream>
using namespace std;
template<int arrayOneSize, int arrayTwoSize>
class myClass{
public:
myClass(){
for(int i = 0; i < arrayOneSize; i ){
arrayOne[i] = i;
}
for(int i = 0; i < arrayTwoSize; i ){
arrayTwo[i] = i;
}
}
int arrayOne[arrayOneSize];
int arrayTwo[arrayTwoSize];
void printArrayElements(){
for(int i = 0; i < arrayOneSize; i ){
cout << arrayOne[i] << '\n';
}
for(int i = 0; i < arrayTwoSize; i ){
cout << arrayTwo[i] << '\n';
}
}
void someOtherFunction();
};
// can't figure out how to define constructors or functions outside of class
void myClass::someOtherFunction(){
}
template <int numInstances>
class myClassContainer{
public:
myClassContainer(){
for(int i = 0; i < numInstances; i ){
myClassInstances[i] = NULL;
}
}
// this doesn't work
template<int, int> myClass<int, int> *myClassInstances[numInstances];
// also doesn't work
void addClassInstance(myClass *instance){
for(int i = 0; i < numInstances; i ){
if(myClassInstances[i] == NULL){
myClassInstances[i] = instance;
}
}
}
void printAll(){
for(int i = 0; i < numInstances; i ){
myClassInstances[i]->printArrayElements();
}
}
};
int main()
{
myClass<5,6> myClass1;
myClass<1,4> myClass2;
myClassContainer<2> container;
container.addClassInstance(&myClass1);
container.addClassInstance(&myClass2);
container.printArrayElements();
return 0;
}
我希望能夠將指向 myClass 實體的指標傳遞到 myClassContainer,但我無法弄清楚模板語法。提前感謝您的任何建議。
uj5u.com熱心網友回復:
無法弄清楚如何在類之外定義建構式或函式
void myClass::someOtherFunction(){}
這里的問題是沒有名為myClass. 相反,只有類稱為myClass<someNumber, anotherNumber>. 所以,為了定義someOtherFunction,它必須寫成這樣:
void myClass<someNumber, anotherNumber>::someOtherFunction() { ... }
但是,既不是具體數字someNumber也不anotherNumber是具體數字,因此您需要將它們設為模板引數:
template<int someNumber, int anotherNumber>
void myClass<someNumber, anotherNumber>::someOtherFunction() { ... }
另請注意,使用與類宣告中使用的模板名稱相同的模板名稱更為常見和方便,因此您的定義將是:
template<int arrayOneSize, int arrayTwoSize>
void myClass<arrayOneSize, arrayTwoSize>::someOtherFunction() { ... }
這不起作用
template<int, int> myClass<int, int> *myClassInstances[numInstances];
這里的問題是所有類成員的型別必須在定義類時就知道。所以你不能有一個模板類的成員在定義外部類時不能推斷出它的型別。所以你需要:
- 為兩個模板引數分配一些具體的值:
template <int numInstances>
class myClassContainer{
myClass<2, 3> *myClassInstances[numInstances];
};
- 您可以使用模板引數
myClassContainer來計算一個值:
myClass<numInstances, numInstances * 2> *myClassInstances[numInstances];
- 或者您可以將它們都設為模板引數,并將它們添加到類模板引數中:
template <int numInstances, int A, int B>
class myClassContainer{
myClass<A, B> *myClassInstances[numInstances];
};
- 當然,您可以將它們混合在一起
請注意,無論您決定采用哪種方法,都不能將兩者都添加myClass<5, 6>到myClass<1, 4>同一個陣列中,因為它們的型別不同。
也不起作用
void addClassInstance(myClass *instance)
再一次,myClass不是型別,而是必須是myClass<someValue, anotherValue>. 因此,您必須將模板引數添加到函式中:
template<int someValue, int anotherValue>
void addClassInstance(myClass<someValue, anotherValue *instance){ ... }
In case you want to define this outside of the class:
template<int numInstances>
template<int someValue, int anotherValue>
void myClassContainer<numInstances>::addClassInstance(myClass<someValue, anotherValue> *instance)
{ ... }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/452234.html
上一篇:盡管存在Python類屬性錯誤?
