簡體   English   中英

模棱兩可的重載構造函數:C ++

[英]Ambiguous Overloaded Constructor: C++

我正在完成與矩陣乘法有關的任務。 我們得到了一些我已填寫的骨架文件; 但是我正在處理一個模棱兩可的構造函數錯誤,並且構造函數的評分方式必須保持不變:

test.cpp:6:7錯誤:重載的“ Mat4()”的調用不明確

在我的測試代碼中

Mat4 I; // to result in a call to SetIdentity() via the default constructor
I.Print( "I = " ); // should print the Identity Matrix for a 4x4

相關的Mat4.h代碼:

class Mat4{
protected:
    float   m[4][4];

public:
    // ** 3A: **
Mat4( );
Mat4( float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0 );

和我的Mat4.cpp代碼:

Mat4::Mat4( ){
SetIdentity( );
}

Mat4::Mat4( float a, float b, float c, float d, float e, float f, float g, float h,   float i, float j, float k, float l, float n, float o, float p, float q){
m[0][0] = a;
m[0][1] = b;
m[0][2] = c;
m[0][3] = d;
m[1][0] = e;
m[1][1] = f;
m[1][2] = g;
m[1][3] = h;
m[2][0] = i;
m[2][1] = j;
m[2][2] = k;
m[2][3] = l;
m[3][0] = n;
m[3][1] = o;
m[3][2] = p;
m[3][3] = q;
}

非默認構造函數的使用示例:

Mat4
Mat4::operator*( Mat4& that ){
// "this" is a pointer to this class's mat4  (this->name)
// "that" is a reference to the other matrix (that.name)

Mat4 result(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
int i, j, k;
for(i = 0; i < 4; i++){
    for(j = 0; j < 4; j++){
        for(k = 0; k < 4; k++){
            result.m[i][j] += (float)(this->m[i][k]*that.m[k][j]);
        }
    }
}
return result;
}

謝謝您的幫助!

編譯器完全無法區分沒有參數的構造函數Mat4( ) 來自具有所有默認參數Mat4(float=0,float=0... )構造方法。
按照定義它們的方式,當調用Mat4()時需要調用什么構造函數是模棱兩可的。

天真的解決方案:
1.您可以向Mat4()添加啞元參數,例如Mat4(bool b)來解決歧義或
2.使構造函數中的第一個參數具有許多非默認參數

所有這些解決方案都可以解決問題,但不能解決引起該問題的原因。
問題的原因是方法設計中的錯誤。

更新(建議的解決方案- 更改方法設計 ):
這樣的錯誤表明您的類方法的設計不符合需要。
因此,如@sth所建議,請使用一個構造函數而不是不明確的2。
所有需要的場景都可以在該構造函數的主體中處理,因此我們得到:

Matrix(float[] arr = 0, int sizeOfArray = 0)
{
  if (arr == 0)
    // use scenario which you used for Matrix()
  else // use scenario which you used for Matrix(float,float...)
}

第二種變體 ,而不是將check放在構造函數的主體中並根據條件選擇變體,可以實現基於重載分辨率的選擇
當您需要2個構造函數時:

Matrix(float[] arr, int sizeOfArray)
Matrix()

編譯器不知道“ Mat4()”還是“ Mat4(float = 0,float = 0,float = 0,float = 0,float = 0,float = 0,float = 0,float = 0,float = 0,float = 0 ,當您定義“ Mat4 I”時,float = 0,float = 0,float = 0,float = 0,float = 0,float = 0,float = 0)“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM