c++ - 在 C++ 中存储/返回继承类的最佳方式

标签 c++ pointers inheritance wrapper

我正在围绕一些自动生成的类编写包装器以提供更好的界面。我写了一个简化的例子来演示这个问题。

我有一个类 A,它有一个指向类 X 的对象的指针,然后我有一个类 B(继承 A),它有一个指向类 Y(继承 X)的对象的指针。

这一切都很好,除了我不确定存储指向 X 和 Y 的指针的最佳方法是什么。我需要能够操作 A 类和 B 类对象的集合,就好像它们都是 A(具有指向 X 的指针是我在那里所需要的),这在我下面的示例中运行良好。

我的实际问题是如何最好地处理需要操纵 Y 类对象而不是 X 类对象的类 B 的情况。我确信我遗漏了一些非常明显的东西,我可以在这里使用它。每次使用它并为每个继承我创建的 A 的类定义一个具有不同名称(例如 getY)的方法时,我都不得不重复转换它,这感觉很笨拙。可能有许多方法,例如 doStuff,所有这些方法都必须调用 getY。

class X {
private:
    int i;
public:
    X(int i) : i(i) {}
    int getI() {
        return i;
    }
};

class Y : public X {
private:
    int j;
public:
    Y(int i, int j) : X(i), j(j) {}
    int getJ() {
        return j;
    }
};

class A {
protected:
    X* x;
public:
    A(X* a) : x(a) {}
    X* get() {
        return x;
    }
};

class B : public A {
public:
    B(Y* y) : A(y) {}
private:
    //I could create a new function for each class like class B
    Y* getY() {
        return (Y*)x;
    }
public:
    void doStuff() {
        Y* y = getY();
        y->getJ();
        std::cout << "J: " << y->getJ() << cout::endl;
    }
};

主要内容摘录:

X* x = new X(5);
Y* y = new Y(5,6);
B b(y);
b.doStuff();

我想到的一个替代方案是,当我构造类 B 时,我可以初始化一个 Y 类型变量的指针,指向与在 X 中设置的相同的位置。只要我的指针是常量,我认为应该是避免两个指向不同事物的引用。

欢迎提出任何想法。

谢谢。

最佳答案

那么我首先要做的就是打破A和B之间的继承关系,你说他们有一个共同的接口(interface),那么从定义这个接口(interface)开始:

class ILibraryWrapper {
public:
    virtual X * get() = 0;
};

我假设A和B共享很多代码(因此继承关系),所以接下来定义一个模板类来实现接口(interface)并定义公共(public)位:

template <class T> class LibraryWrapper : public ILibraryWrapper {
protected:
    T * pointer;

public:
    LibraryWrapper( T * value ) : pointer( value ) {}

    virtual X * get() override { return static_cast<X *>( this->pointer ); }
};

最后,像这样定义 A 和 B:

class A : public LibraryWrapper<X> {
public:
    A( X * value ) : LibraryWrapper( value ) {}
};

class B : public LibraryWrapper<Y> {
public:
    B( Y * value ) : LibraryWrapper( value ) {}

    void doStuff() {
        std::cout << "J: " << this->pointer->getJ() << cout::endl;
    }
};

实际上您的所有代码都应该处理 ILibraryWrapper 指针或引用。如果某些代码绝对必须知道包装对象的具体类型,那么您可以进行动态转换:

auto wrapper = dynamic_cast<LibraryWrapper<Y> *>( object );
if( wrapper != nullptr ) {
    // ...
}

但一般来说,最好在 ILibraryWrapper 接口(interface)中提供所有需要的功能。

关于c++ - 在 C++ 中存储/返回继承类的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14523467/

相关文章:

c++ - Qt:如何强制隐藏的小部件计算其布局?

c++ - 内联函数的具体用途是什么?

c++ - `std::function` 是否允许移动其参数?

c - C 中的指针 : assigning a literal to int *

c++ - 从没有默认构造函数的虚拟基类派生类

c++ - C++中的空指针声明混淆

c - 输出应该是什么?

c++ - 通过引用和指针传递参数 C++

javascript - Extjs多重继承?

java - 如何从父类(super class)对象调用子类方法