这次做图系统进行系统层级代码的编写,才发现C++中的诸多问题,以前并未思考过,现在查阅了大量资料才大致了解应该怎么做,仅以本文作为记录。
C++很大一个问题在于泛型编程与面向对象的耦合问题。
用数组存储类的继承,多态性就会被消除(这是因为不同继承类的大小不同,无法统一),因而必须以指针形式存储。
class Base;
Base** bases = new Base* [10];
vector<Base*> bases[10]; // or
注意C++是静态类型的语言,工厂模式(factory pattern)比较难实现。 函数返回不同的类型不是最麻烦的,最麻烦的是函数返回不同的泛型的特例,此时这些类型都是不同的,没有共同的基类,无法简单用基类指针解决。
what_type factory(int i){
if (i == 1)
return vector<int> (10,0);
else
return vector<bool> (10,0);
}
int main()
{
what_type fac = factory(1);
}
为了避免出现新建的变量出了作用域会被消除的情况,如下
A* instance = NULL;
if ( condition = true )
instance = new A(1);
else
instance = new A(2);
// or use ternary operator
A* instance = new A( condition ? 1 : 2 );
// factory patter
class A; // abstract
class B : public A;
class C : public A;
class AFactory
{
public:
A* create(int x)
{
if ( x == 0 )
return new B;
if ( x == 1 )
return new C;
return NULL;
}
};
C++17中引入了std::variant
来存储多种类型,是类似于union
的东西,通过get
、visit
等方法来访问元素
std::variant<int, double, std::string> x, y;
// assign value
x = 1;
y = "1.0";
// overwrite value
x = 2.0;