如何将一个抽象类的派生类作为参数传递?

问题描述 投票:0回答:1

我目前正在开发一个C++头文件,用于编码和解码文本。准确的说是:UTF-8、UTF-16、UCS-2和UTF-32。UTF -8, UTF -16, UCS -2 和 UTF -32. 但是我的C++知识已经到了不能再进一步的地步。

我想用一个抽象类来进行解码和编码 同时为每个编解码器创建基类。然后,如果使用任何与编码或解码相关的函数,开发人员应该可以只传递一个自定义的数据类型给函数。

问题是,我不知道如何真正做到这一点。毕竟,你不能传递一个静态类作为参数。但我也不想硬编码什么,开发者应该也能不费吹灰之力地添加任何编解码器,而且不需要修改我的头。

另外,它应该尽可能的简单。代码应该是这样的。

namespace Encoding {

  class Encoder {
  public:
    virtual std::string Encode(std::string sOriginal) = 0;
  };

  // Derived classes like UTF8 and UCS2 here

}

void OutputEncoded(std::string s, Encoder enc) {
  std::cout << enc.Encode(s);
}


int main() {
  OutputEncoded("Hellö Wörld!", Encoding::UTF8);
}

你知道怎么做吗?也许可以不创建对象,只使用静态方法?或者我必须使用一个带有指针的对象?

c++ parameters static polymorphism abstract
1个回答
2
投票

抽象类的可能替代品是模板。

namespace Encoding {

  class UTF8 {
  public:
    static std::string Encode(std::string sOriginal);
  };
  class UCS2 {
  public:
    static std::string Encode(std::string sOriginal);
  };

}

template <typename Encoder>
void OutputEncoded(const std::string& s) {
  std::cout << Encoder::Encode(s);
}

int main()
{
  OutputEncoded<Encoding::UTF8>("Hellö Wörld!");
}

UTF8和UCS2类应该尊重相同的接口,而不需要抽象类和虚拟方法来执行。

C++20的概念可能有助于强制执行正确的用法。之前可能用SFINAE,但比较啰嗦。


1
投票

我自己找到了一个方法。其实很简单。

class Base {
public:
  virtual void DoSomething(void) = 0;
};

class Derived : public Base {
  void DoSomething(void) {
    std::cout << "Test";
  }
} DerivedTest;

Base* const DerivedTestPtr = &DerivedTest;



void Test(Base* b) {
  b->DoSomething();
}



int main() {
  Test(DerivedTestPtr);
}
© www.soinside.com 2019 - 2024. All rights reserved.