2014-05-23 55 views
0

我正在編寫一個預測校正器數值求解器。我寫了一個工作循環數組來跟蹤我的函數以前的值。將模板類型名傳遞給嵌套類的構造函數

#include <cmath> 
// Circular array 
// this is fixed sized container to hold the last n update of a function 
// written by Keivan Moradi 2014 
template <typename T> 
class carray 
{ 
    public: 
     carray(int s) 
     { 
      size = exp2(ceil(log2(s))); 
      array = new T[size]; 
      SizeNegOne = size-1; 
      head = SizeNegOne; 
     } 
     void initialize(T n) 
     { 
      for (head=0; head<size; head++) 
       array[head]=n; 
      head = SizeNegOne; 
     } 
     void update(T h) 
     { 
      // bitwise modulus: 
      // if "size" is in power of 2: 
      //(head+1) & SizeNegOne = (head+1) % size 
      // in contrast to modulus, this method is guaranteed to get positive values 
      head = (head+1) & SizeNegOne; 
      array[head]=h; 
     } 
     T operator[](int index) 
     { 
      // bitwise modulus: 
      // if "size" is in power of 2: 
      // (head + index) & SizeNegOne = (head + index) % size 
      // in contrast to modulus, this method is guaranteed to get positive values 
      return array[(head + index) & SizeNegOne]; 
     } 
     ~carray() 
     { 
      delete [] array; 
     } 
    protected: 
    private: 
     T *array; 
     int size, SizeNegOne, head; 
}; 

下面的代碼顯示了這個代碼是如何工作的:

int main() 
{ 
    carray<float> phi(3); 
    phi.initialize(-64); 
    std::cout<<phi[0]<<" "<<phi[-1]<<" "<<phi[-2]<<" "<<phi[-3]<<" "<<phi[-4]<<" "<<phi[-5]<<" "<<phi[-6]<<" "<<phi[-7]<<" "<<phi[-8]<<std::endl<<std::endl; 

    phi.update(6.1); 
    std::cout<<phi[0]<<" "<<phi[-1]<<" "<<phi[-2]<<" "<<phi[-3]<<" "<<phi[-4]<<" "<<phi[-5]<<" "<<phi[-6]<<" "<<phi[-7]<<" "<<phi[-8]<<std::endl<<std::endl; 

    phi.update(7.1); 
    std::cout<<phi[0]<<" "<<phi[-1]<<" "<<phi[-2]<<" "<<phi[-3]<<" "<<phi[-4]<<" "<<phi[-5]<<" "<<phi[-6]<<" "<<phi[-7]<<" "<<phi[-8]<<std::endl<<std::endl; 

    phi.update(8.1); 
    std::cout<<phi[0]<<" "<<phi[-1]<<" "<<phi[-2]<<" "<<phi[-3]<<" "<<phi[-4]<<" "<<phi[-5]<<" "<<phi[-6]<<" "<<phi[-7]<<" "<<phi[-8]<<std::endl<<std::endl; 

    phi.update(9.1); 
    std::cout<<phi[0]<<" "<<phi[-1]<<" "<<phi[-2]<<" "<<phi[-3]<<" "<<phi[-4]<<" "<<phi[-5]<<" "<<phi[-6]<<" "<<phi[-7]<<" "<<phi[-8]<<std::endl<<std::endl; 

    phi.update(10.1); 
    std::cout<<phi[0]<<" "<<phi[-1]<<" "<<phi[-2]<<" "<<phi[-3]<<" "<<phi[-4]<<" "<<phi[-5]<<" "<<phi[-6]<<" "<<phi[-7]<<" "<<phi[-8]<<std::endl<<std::endl; 

    return 0; 
} 

現在我想窩預測類中這個類,這樣我可以使用它是這樣的:

int main() 
{ 
    predictor<float> phi(4); 
    phi.update(10); 
    phi.update(11); 
    phi.update(12); 
    phi.update(13); 
    std::cout<<phi.predict2ndOrder()<<std::endl; 
} 

此代碼顯示了我失敗的最好的嘗試:

#include <cmath> 
template <typename T> 
class predictor 
{ 
    public: 
     predictor(int s) 
     { 
      size = s; 
     } 
     void update(T a) 
     { 
      f.update(a); 
     } 
     T predict2ndOrder() 
     { 
      return f[0] + (3/2*(f[0]-f[-1])-1/2*(f[-1]-f[-2])); 
     } 
    private: 
     int size; 
     carray<T> f(size); 
     class carray 
     { 
      public: 
       carray(int s) 
       { 
        size = exp2(ceil(log2(s))); 
        array = new T[size]; 
        SizeNegOne = size-1; 
        head = SizeNegOne; 
       } 
       ~carray() 
       { 
        delete [] array; 
       } 
       void initialize(T n) 
       { 
        for (head=0; head<size; head++) 
         array[head]=n; 
        head = SizeNegOne; 
       } 
       void update(T h) 
       { 
        head = (head+1) & SizeNegOne; 
        array[head]=h; 
       } 
       T operator[](int index) 
       { 
        return array[(head + index) & SizeNegOne]; 
       } 
      private: 
       T *array; 
       int size, SizeNegOne, head; 
     }; 
}; 

請你讓我知道如何解決這個問題?我是一名新的C++程序員,所以請放輕鬆點。 ;)

+0

我注意到你不遵循【三規則(http://stackoverflow.com/questions/4172722/what-是最規則的三)。 – chris

+0

[Rule of Zero]相同(http://isocpp.org/blog/2012/11/rule-of-zero) –

+0

所以使用'std :: vector'。 – Jarod42

回答

0

示例代碼中存在一些我不會涉及的拼寫錯誤,但將T類從預測變爲carray非常簡單。這裏有一種可能性:像在第一個代碼片段中那樣聲明Carray作爲模板類。爲了讓剩下的工作,糾正拼寫錯誤,將大小和f的聲明移動到carray和init大小的類定義之下,並將f作爲初始化列表以預測符構造函數中的正確順序移動。

下面是修改後的代碼編譯罰款,我在VS2010:

#include <cmath> 
using namespace std; 

template <typename T> 
class predictor 
{ 
public: 
    predictor(int s) 
     : size(s) 
     , f(size) 
    { 
    } 
    void update(int a) 
    { 
     f.update(a); 
    } 
    T predict2ndOrder(float deltaT) 
    { 
     return f[0] + deltaT*(3/4*(f[0]-f[1]-1/2*(f[1]-f[2]))); 
    } 
private: 
    template <typename S> 
    class carray 
    { 
    public: 
     carray(int s) 
     { 
     size = exp(ceil(log((S)s))); 
     array = new S[size]; 
     SizeNegOne = size-1; 
     head = SizeNegOne; 
     } 
     ~carray() 
     { 
     delete [] array; 
     } 
     void initialize(S n) 
     { 
     for (head=0; head<size; head++) 
      array[head]=n; 
     head = SizeNegOne; 
     } 
     void update(S h) 
     { 
     head = (head+1) & SizeNegOne; 
     array[head]=h; 
     } 
     S operator[](int index) 
     { 
     return array[(head + index) & SizeNegOne]; 
     } 
    private: 
     S *array; 
     int size, SizeNegOne, head; 
    }; 

    int size; 
    carray<T> f; 
}; 
+0

我試過你的建議代碼。我有固定的拼寫錯誤,但仍然在code :: blocks中出現這些錯誤: 錯誤:'T類'聲明 錯誤:陰影模板parm'類T'。 在visual Studio 2013中,沒有錯誤,但也沒有輸出。 我也有一個問題,(T)s是鑄造的一些動力?如果是別的東西,它叫什麼,以便我可以更多地瞭解它。 謝謝 – user9224

+0

@ user9224對陰影模板參數感到抱歉;只需將carray-T-template-param改爲不同的東西即可。你是對的關於鑄造;我認爲需要選擇正確的日誌實現f.e.日誌(float)和日誌(double)之間。你也可以寫下static_cast (s),這是C和更多的C++。關於輸出,我承認我根本沒有看過語義。我更新了carray的新模板參數名稱的答案。 –

+0

@ user9224我從來不使用代碼塊,但運行代碼(包括對模板參數名稱的建議更改)的確在VS2010中爲我提供了輸出,並且我看不到任何可能導致空輸出的內容;因爲phi.predict2ndOrder返回一個浮點數,所以總會有一個打印到std :: cout的值。還請注意,預測器不會在您顯示的最後一個main()中爲其carray成員稱爲array的initialise()調用;也許你想在預測構造函數中調用它。 –

相關問題