typedef是否应该同时包含在类定义和类声明中?

时间:2019-09-18 13:56:52

标签: c++ class scope typedef

我正在学习C ++。我知道C ++比其他大多数语言都要冗长一些,但是在struct /类声明中定义typedef,然后在struct /类定义中再次定义,让我开始思考是否存在更好或更核心的功能typedef的位置,该位置只需要定义一次,并且是否遵循C ++最佳做法。我在网上找不到任何特别的东西。

typedef移到更全局的位置似乎是不合适的,并且typedef既用于结构中方法的定义和实现。

//--ProductFilter.h--
struct ProductFilter {
    typedef std::vector<Product*> Items;
    static Items by_color(Items items, Color color);
};

//--ProductFilter.cpp--
typedef std::vector<Product*> Items;
Items ProductFilter::by_color(Items items, Color color) {
    Items result;
    for (auto& item : items)
        if (item->color == color)
            result.push_back(item);
    return result;
}

5 个答案:

答案 0 :(得分:2)

您不需要在类声明和类定义中定义typedef。您这样做的原因是当您这样做

Items ProductFilter::by_color(Items items, Color color) {
    Items result;
    for (auto& item : items)
        if (item->color == color)
            result.push_back(item);
    return result;
}

返回类型的Items不在该类的范围内,因此Items必须是全局范围内的名称。如果您使用

ProductFilter::Items ProductFilter::by_color(Items items, Color color) {
    Items result;
    for (auto& item : items)
        if (item->color == color)
            result.push_back(item);
    return result;
}

那么您将不再遇到此问题,而只需在类声明中使用typedef。


您不需要执行ProductFilter::Items的原因

ProductFilter::by_color(Items items, Color color)

是因为ProductFilter::将您置于类的范围内,因此您可以使用在类中定义的名称而不必限定它们的名称。

答案 1 :(得分:2)

您的定义应为:

ProductFilter::Items ProductFilter::by_color(Items items, Color color)
{
    // ...
}

或,带有尾随返回类型:

auto ProductFilter::by_color(Items items, Color color) -> Items 
{
    // ...
}

答案 2 :(得分:1)

您的两个typdef实际上为同一类型声明了两个不同的别名。一个是ProductFilter::Items,另一个是Items

实际上,我不确定在Items范围内编写ProductFilter时得到的规则,尽管这并不重要,因为它们无论如何都是相同的。

您只需要其中一个。您选择哪一个取决于您要在哪个范围内声明它。如果Items在语义上属于ProductFilter,那么我会选择第一个并将其仅放在声明中。

您必须将返回类型限定为ProductFilter::Items(或使用尾随返回类型)。

答案 3 :(得分:1)

只需在类范围之外使用typedef的限定名称

ProductFilter::Items ProductFilter::by_color(Items items, Color color) {
    Items result;
    for (auto& item : items)
        if (item->color == color)
            result.push_back(item);
    return result;
}

答案 4 :(得分:0)

出于实际原因,想要从cpp中的类中获取类型没有错。您只是不应该重新定义,而应该给它起别名:

// top of cpp file
using Items = ProductFilter::Items;

如果项的类型发生变化,则无需重写别名。