C++要点笔记(24)——类的静态成员

C++类中的静态数据成员(static data member)只是声明(declaration),不是定义(definition),需要在类定义外显示地进行定义。这样做是避免定义类的头文件被多个文件包含后,引起编译问题:

class A {
public:
    static int a;
};

int A::a;

除了静态数据成员(static data member),还有静态成员函数(static member function)。它们的共同点是属于整个类,而不属于类的某一个实例,可以通过“类名::成员”方式来访问。需要注意的是,由于静态成员函数没有指向实例的this指针,所以它只能访问类的静态数据成员,而不能访问每个实例的成员。

参考资料:
Static Data Member Initialization
Static data members in C++

 

Mesos笔记 (9)—— Containerizer类代码解析

Containerizer类(定义在src/slave/containerizer/containerizer.hpp )是所有Containerizer的抽象父类。除了默认的构造函数和一个什么都没做的析构函数,其只实现了createresources方法。create方法代码如下(v0.26版本):

Try<Containerizer*> Containerizer::create(
    const Flags& flags,
    bool local,
    Fetcher* fetcher)
{
  if (flags.isolation == "external") {
    LOG(WARNING) << "The 'external' isolation flag is deprecated, "
                 << "please update your flags to"
                 << " '--containerizers=external'.";

    Try<ExternalContainerizer*> containerizer =
      ExternalContainerizer::create(flags);
    if (containerizer.isError()) {
      return Error("Could not create ExternalContainerizer: " +
                   containerizer.error());
    }

    return containerizer.get();
  }

  // TODO(benh): We need to store which containerizer or
  // containerizers were being used. See MESOS-1663.

  // Create containerizer(s).
  vector<Containerizer*> containerizers;

  foreach (const string& type, strings::split(flags.containerizers, ",")) {
    if (type == "mesos") {
      Try<MesosContainerizer*> containerizer =
        MesosContainerizer::create(flags, local, fetcher);
      if (containerizer.isError()) {
        return Error("Could not create MesosContainerizer: " +
                     containerizer.error());
      } else {
        containerizers.push_back(containerizer.get());
      }
    } else if (type == "docker") {
      Try<DockerContainerizer*> containerizer =
        DockerContainerizer::create(flags, fetcher);
      if (containerizer.isError()) {
        return Error("Could not create DockerContainerizer: " +
                     containerizer.error());
      } else {
        containerizers.push_back(containerizer.get());
      }
    } else if (type == "external") {
      Try<ExternalContainerizer*> containerizer =
        ExternalContainerizer::create(flags);
      if (containerizer.isError()) {
        return Error("Could not create ExternalContainerizer: " +
                     containerizer.error());
      } else {
        containerizers.push_back(containerizer.get());
      }
    } else {
      return Error("Unknown or unsupported containerizer: " + type);
    }
  }

  if (containerizers.size() == 1) {
    return containerizers.front();
  }

  Try<ComposingContainerizer*> containerizer =
    ComposingContainerizer::create(containerizers);

  if (containerizer.isError()) {
    return Error(containerizer.error());
  }

  return containerizer.get();
}

默认情况下,containerizerstypemesos,所以会调用MesosContainerizer::create来生成containerizer。关于resources方法,参考Mesos笔记 (5)—— 资源

 

C++要点笔记(23)——static_cast,reinterpret_cast,const_cast和dynamic_cast

Quora上一篇帖子对这几种cast做了很好的解释。总结一下:

1 2

关于dynamic_cast的四种情况:

下面选自“More effective C++, item 27”:

Simply put, dynamic_casting a pointer to void* (or const void* or volatile void* or, for those who can’t get enough modifiers in their usual diet, const volatile void*) yields a pointer to the beginning of the memory for the object pointed to by the pointer. But dynamic_cast is applicable only to pointers to objects that have at least one virtual function.

 

C++要点笔记(22)——多态(Polymorphism)

下面是对Polymorphism的解释:

Polymorphism means “many forms”. It is where one type of thing comes in many forms. So you can treat it according to its type, but it will behave differently according to which form of that type it happens to be.

Polymorphism含义为一个类型有多种形式:这些形式虽属于同一类型,但是具体的行为不同。

Polymorphism stems from inheritance. The whole idea is that you have a general base class and more specific derived classes. You can then write code that works with the base class… and polymorphims makes your code not only work with the base class, but all derived classes.

Polymorphism源于继承,它可以让代码对基类和衍生类都能工作。

One of the features of derived classes is that a pointer to a derived class is type-compatible with a pointer to its base class. Polymorphism takes advantage of this feature.

Polymorphism利用了衍生类的指针与基类指针兼容的特性。

A class that declares or inherits a virtual function is called a polymorphic class.

Polymorphism class是定义或继承了virtual functionclass

Pure virtual function定义:

virtual void f() = 0;

包含pure virtual function定义的类是abstract class

参考资料:
I don’t understand Polymorphism at all?
C++ polymorphism and abstract base class

 

C++要点笔记(21)——引用(reference)

Reference可以看做是一个变量的别名:

int x;
int& foo = x;

Reference的一个重要用途是用在函数传参中:

int workWithClass( const MyClass& a_class_object )
{
}

在上述函数中,因为参数是引用,所以省去了copy参数的工作;并且由于有const修饰,所以不会对参数所指向的对象进行修改。

一旦reference绑定了一个object,它不能再绑定其它的object(参考stackoverflow)。

Polymorphisms works both for pointers and references:

class instrument {
public:
    virtual void play(){}
};

class drum : public instrument {
public:
    virtual void play() override{
        std::cout << "dum, dum" << std::endl;
    }
};

class piano : public instrument {
public:
    virtual void play() override{
        std::cout << "pling" << std::endl;
    }
};

int main (){
    instrument i;
    piano p;
    drum d;

    instrument &pi = i;
    pi.play();  // -

    instrument &pp = p;
    pp.play();  // pling

    instrument &pd = d;
    pd.play();  // dum, dum
}

输出:

pling                                                                                                                              
dum, dum 

参考资料:
C++ References