2015-12-30 70 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这样的函数如何处理没有它应该使用的元素的类型的像素。)