我正在学习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;
}
答案 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;
如果项的类型发生变化,则无需重写别名。