C++ 派生类(向量):这是个坏主意吗?

C++ 派生类(向量):这是个坏主意吗?,c++,C++,我将为我正在编写的库“创建”我自己的向量类。我不会从头创建一个vector类,只是使用std::vector作为父类,并向派生的vector类添加一些内容 这就是说,我需要一些建议。我的问题是: 1) 调用我的派生类vector(当然是在另一个名称空间中)是个坏主意吗?在这种情况下,我会遇到什么样的冲突 2) 我想重载数学运算符,以便能够添加向量、将向量乘以常数等。这实际上就是我决定在std::vector之上构建向量类的原因。但是,我可以直接重载std::vector的数学运算符,省去创建(另

我将为我正在编写的库“创建”我自己的向量类。我不会从头创建一个vector类,只是使用
std::vector
作为父类,并向派生的vector类添加一些内容

这就是说,我需要一些建议。我的问题是:

1) 调用我的派生类
vector
(当然是在另一个名称空间中)是个坏主意吗?在这种情况下,我会遇到什么样的冲突

2) 我想重载数学运算符,以便能够添加向量、将向量乘以常数等。这实际上就是我决定在
std::vector
之上构建向量类的原因。但是,我可以直接重载
std::vector的数学运算符,省去创建(另一个…)vector类的麻烦——但这是个坏主意吗

3) 我非常希望从
std::vector
继承构造函数,但是在没有编译器错误的情况下,我很难做到这一点。有人能给我举一个具体的例子,告诉我如何做到这一点吗

谢谢大家!

1)在名称空间下编写自己的向量。但是,尽量不要从STL派生

2,3)忘记std::vector,编写自己的方法和运算符

此外,您还可以在新类中包装
std::vector
,并编写接口来操作它。

1)在名称空间下编写自己的向量。但是,尽量不要从STL派生

2,3)忘记std::vector,编写自己的方法和运算符


此外,您还可以在新类中包装
std::vector
,并编写接口来操作它。

我不鼓励您这样做。如果您需要一个新的容器,只需嵌入(或私下继承)
std::vector
,而不是从它公开继承

关于你的问题:

1) 调用我的派生类向量(当然是在另一个名称空间内)是个坏主意吗?在这种情况下,我会遇到什么样的冲突

只要您和您的任何客户机都不会使用
指令通过
导入
std
名称空间和您的名称空间,我就看不出有什么特别的问题

2) 我想重载数学运算符,以便能够添加向量、将向量乘以常量等。这实际上就是我决定在std::vector之上构建向量类的原因。但是,我可以直接重载std::vector的数学运算符,省去创建(另一个…)vector类的麻烦——但这是个坏主意吗

是的,这是个坏主意。如果为
std::vector
创建了数学运算符的重载,则无法在
std::vector
所属的命名空间中创建它们。通过ADL,可能会在该名称空间中找到一个全局
操作符+
,即使它不合适。如果是这种情况,您的
操作符+
甚至不会被查找,您将得到一个编译器错误

3) 我非常希望从std::vector继承构造函数,但是在没有编译器错误的情况下,我很难做到这一点。有人能给我举一个具体的例子,告诉我如何做到这一点吗

在C++11中,可以使用继承的构造函数。例如:

#include <vector>

template<typename T, typename Allocator = std::allocator<T>>
class myvector : public std::vector<T, Allocator>
{
    using typename std::vector<T, Allocator>::vector;
};

#include <iostream>

int main()
{
   std::vector<int> vi { 1, 2, 3, 4, 5};

   // Uses inherited constructor
   myvector<int> v(vi.begin(), vi.end());

   for (auto i : v) { std::cout << i << " "; };
}
#包括
模板
类myvector:public std::vector
{
使用typename std::vector::vector;
};
#包括
int main()
{
std::向量vi{1,2,3,4,5};
//使用继承的构造函数
myvector v(vi.begin(),vi.end());

对于(autoi:v){std::cout我不鼓励您这样做。如果您需要一个新容器,只需嵌入(或私下继承)
std::vector
,而不是从它公开继承

关于你的问题:

1) 调用我的派生类向量(当然是在另一个名称空间内)是个坏主意吗?在这种情况下会有什么样的冲突

只要您和您的任何客户机都不会使用
指令通过
导入
std
名称空间和您的名称空间,我就看不出有什么特别的问题

2) 我想重载数学运算符,以便能够添加向量、将向量乘以常数等。这实际上就是我决定在std::vector的基础上构建vector类的原因。但是,我可以直接重载std::vector的数学运算符,省去创建(另一个…)的麻烦向量类——但这是个坏主意吗

是的,这是一个坏主意。如果您为
std::vector
创建了数学运算符的重载,则无法在
std::vector
所属的命名空间中创建它们。通过ADL,可能会在该命名空间中找到全局
运算符+
,即使不合适。如果是这样,您的
运算符+
也不会如果查找en,您将得到一个编译器错误

3) 我很想从std::vector继承构造函数,但是在没有编译器错误的情况下,我很难做到这一点。有人能给我提供一个具体的例子来说明如何做到这一点吗

在C++11中,可以使用继承的构造函数。例如:

#include <vector>

template<typename T, typename Allocator = std::allocator<T>>
class myvector : public std::vector<T, Allocator>
{
    using typename std::vector<T, Allocator>::vector;
};

#include <iostream>

int main()
{
   std::vector<int> vi { 1, 2, 3, 4, 5};

   // Uses inherited constructor
   myvector<int> v(vi.begin(), vi.end());

   for (auto i : v) { std::cout << i << " "; };
}
#包括
模板
类myvector:public std::vector
{
使用typename std::vector::vector;
};
#包括
int main()
{
std::向量vi{1,2,3,4,5};
//使用继承的构造函数
myvector v(vi.begin(),vi.end());

用于(自动i:v){std::cout首先,请注意,如果您愿意,您可以混淆您的继承。使用
private
继承,然后使用
语句
使
vector
的所有函数都可用。它的类型仍然相当多,因为
vector
中有很多内容,但它不像显式删除那么多对每个函数进行优化,从而防止对继承的常见异议,即peop