2015-10-27 51 views
1

我試圖創建使用操作符[]像如何把多個運營商[]

MyClass[x][y] 

一類,它應該基於什麼我是內定義的函數調用返回一個值類。我至今是:

MyClass.h

class MyClass{ 
    public: 
      // return one value of the matrix 
    friend double operator[][] (const int x, const int y); 
    } 

我甚至不認爲我對這個語法是正確的,我怎麼能寫在MyClass.cpp該功能來確定哪些價值應該返回?

就像是:

MyClass::friend double operator[][] (const int x, const int y) 
{ 
    // insert code here 
} 

嘗試過,但它口口聲聲說的錯誤。我相信這是一個爛攤子在那裏...

非常感謝,

+2

您不能聲明'運營商[] []。你需要兩個重載'operator []'的類才能達到這個效果。 –

+0

您只能重載現有的操作符,而C++沒有'[] []'操作符。 –

+0

您對'friend'的使用也有問題。像你一樣聲明一個函數'friend'意味着它是一個非成員函數,但是你嘗試使用'friend'關鍵字在語法上非法的方式將其定義爲一個成員函數。 –

回答

2

超載operator()絕對是最乾淨的方法。

但是,請記住,這是C++,並且可以彎曲的語法你的意願:)

特別是,如果你堅持想要使用myclass[][],您可以通過聲明「中間階層」這樣做這裏有一個例子:`

Run It Online

#include <iostream> 
using std::cout; 
using std::endl; 

class MyClass { 
public: 

    using IndexType = int; 
    using ReturnType = double; 

    // intermediate structure 
    struct YClass { 
     MyClass& myclass; 
     IndexType x; 
     YClass (MyClass& c, IndexType x_) : myclass(c), x(x_) {} 
     ReturnType operator[](IndexType y_) { return myclass.compute(x, y_); } 
    }; 


    // return an intermediate structure on which you can use opearator[] 
    YClass operator[](IndexType x) { return {*this, x}; } 

    // actual computation, called by the last "intremediate" class 
    ReturnType compute(IndexType x, IndexType y) { 
     return x * y; 
    } 
}; 

int main() 
{ 
    MyClass myclass; 

    cout << myclass[2][3] << endl; // same as: cout << myclass.compute(2, 3) << endl; 
} 
+0

正是我需要的。謝謝,但你是否還有其他值得研究的選擇? –

+1

很高興幫助! AFAIK,即_(即返回臨時對象,返回另一個臨時對象等)_是在執行_「終端」_操作(例如'compute()')之前繼續進行_「鏈接」_的方式。有很多定製調用語法的技術:例如運算符重載,模板,用戶定義的文字,提供STL友好的迭代器等等。這一切都取決於你的具體用例。 – 865719

0

沒有operator[][]。但您可以改爲申報operator()(int, int)

class Foo { 
public: 
    double operator()(int a, int b) { 
    //... 
    } 
}; 
0

如果你想創建4x4矩陣類,我所採取的方式,並在D3DX庫做的方式是其擁有的類的成員變量:

class Matrix 
{ 
public: 
    // publicly accessible member 4x4 array 
    float m[4][4]; 

    // also accessible via() operator. E.G. float value = mtx(3,2); 
    float operator()(int column, int row); 
} 
2

你需要返回該行的代理對象。這是一個非常簡單的例子,爲了讓你走。我沒有試過編譯它。

class Matrix { 
    int data[4][4]; 

    class Row { 
     Matrix* matrix; 
     int row; 

     int operator[](int index){ 
     return matrix->data[row][index]; // Probably you want to check the index is in range here. 
     } 

    } 

    Row operator[](int row){ 
    Row which_row; 
    which_row.matrix = this; 
    which_row.row = row; // beware that if the user passes the row around it might point to invalid memory if Matrix is deleted. 
    return which_row; 
    } 
} 

你也只是直接從operator[]返回該行,並留下第二[]是直接數組訪問。恕我直言,它與代理對象很好,因爲它可以對索引進行一些檢查,並可能有其他不錯的成員函數。

+0

我試圖計算一個方法,最好不涉及存儲任何形式的矩陣,以允許大規模問題,雖然... –

+0

@QuangThinhHa你的意思是數據沒有存儲在矩陣類本身?它只存儲一個引用/指向數據的指針? – RedX

+0

這種鏈接運算符的方法只需要仔細檢查一下我的無矩陣算法,稍後將包含矩陣求逆。所以它更像是一塊踏腳石。 –