2015-12-30 72 views
4

的元素我有一個C++c_image包含指針類的元件c_pixel一個矢量:指針到一個C++

class c_image { 

    public: 
     vector<shared_ptr<c_pixel>> pixel; 
    ... 
}; 

c_pixel元素包含的元素Z型號的型號爲:

class c_pixel { 

    public: 
     double Z; 
    ... 
}; 

然而,它們擴展了類c_pixel_pv,其中包含PV,雙類型的三個元素的數組:

class c_pixel_pv : public c_pixel { 

    public: 
     double pv[3]; 
    ... 
}; 

c_image還具有如下功能:濾波器

vector<double> c_image::filter(???) { 
     ... 
    }; 

這將作爲輸入指向元素Zpv [0]pv [1]pv [2]

但我不知道如何指向這些元素。我甚至不知道是否可以指出,例如,只有pv [0]元素。我不知道如何開始解決這個問題。有誰能夠幫助我?

+1

如果函數是z或pv [0]或...,函數的行爲會不一樣嗎? –

+0

它不會只是'雙*'嗎?畢竟,'Z'或'pv [..]'都是雙打! – CinCout

+0

你不能有一個「成員指針」,它可以指向「可能在成員內部或可能不是」(注意'pv [0]'不是'c_pixel_pv'的成員,只有'pv')。您的問題會引發很多其他問題,例如:像素爲什麼共享?什麼是共享這些像素的圖像?是否有一點可以包含'c_pixel'和'c_pixel_pv'的圖像? – molbdnilo

回答

3

你可以(並且可能應該)使用多態性,並有在在類覆蓋的c_pixel類虛成員函數。該成員函數使用正確的成員變量執行所需的任何操作,並從c_image::filter調用。

+0

函數c_image :: filter可以是例如中值平滑濾波器,對於圖像的每個像素,計算像素的中值周圍。在這種情況下,單個元素c_pixel並不具有使其平滑所需的全部信息。這就是爲什麼我認爲過濾器無法在c_pixel上運行的原因。 –

+0

@醫學物理學家,但這是你應該做的選擇,我的意思是如果中值平滑不適用於c_pixel,那麼不要在結果集中包含該像素。 –

+1

@醫學物理學家你可以*使用例如'dynamic_cast'來檢查指針是否是指向基類或子類的指針,但會導致[* code smell *](https://en.wikipedia.org/wiki/Code_smell)和代碼將變成難以閱讀,理解和維護。也許你應該有兩個「過濾」功能,而不是每種類型的像素。這可能是一種邊緣代碼味道,但至少它更好。我認爲你真正需要做的是重新考慮你的設計,你真的需要不同的像素類型嗎?單個圖像可以同時使用兩種類型嗎? –

0

OOP概念 - 多態性現在會派上用場。在c_pixel類中,虛擬成員函數(虛擬成員是可以在派生類中重新定義的成員函數,同時保留它的調用屬性,通過引用),在類派生的中被覆蓋,可以執行所需的操作正確的變量。

您將需要從vector<double> c_image::filter()調用此成員函數。

0

你可以使用一個函數,而不是一個指針:

using Selector = std::function<double(const c_pixel&)>; 

vector<double> c_image::filter(Selector select) { 
    // Trivial example that just copies 
    vector<double> result; 
    result.reserve(pixel.size()); 
    for (auto pix: pixel) 
    { 
     result.push_back(select(*pix)); 
    } 
    return result; 
}; 

double z(const c_pixel& p) 
{ 
    return p.Z; 
} 

c_image image; 
// ... 
vector<double> = image.filter(z); 

但是你需要一些方法不同種類的像素的區分,就像一個標籤字節或虛擬函數(所以他們將採取更多的空間,你已經有很多的開銷)。

如果您不需要在圖像中混合像素類型,則可以使用以像素類型爲模板的模板類。
然後,您可以擺脫運行時像素歧視。 (說實話,很難描繪像filter這樣的函數如何處理沒有它應該使用的元素的類型的像素。)