C++ - 将模板 Class 的指针传递给函数

C++ - Pass Pointer of a Template Class to A Function

我正在尝试将指向模板对象的指针传递给另一个 class。

template <int size>
class A {
public:
    int a[size] = {0};

    int getA(int n) {
       return a[n];
    }
};


class B {
public:
    A<>* b;

    void setB(A<>* n) {
        b = n;
    }
};


int main()
{
    const int size1 = 10;

    A<size1> data1;
    B b1;
    
    b1.setB(&data1);
}

这行不通。

作为解决方案,我可以将 B class 创建为模板 class 并将 B 对象创建为 B<A<size1>> b1; 但是如果我乘以这将创建多个对象A<sizeX>,我不想要,因为此代码用于资源有限的嵌入式项目。

我想要的只是将data1对象的指针传递给另一个class函数并将其存储在里面。我正在寻找的代码是针对 C++03,我无法使用 C++11 功能,例如共享指针。

有办法吗?

感谢任何帮助,

我认为您会希望从构造函数中传递 size。模板不适合此用例。

你已经让自己陷入了一个第 22 条军规的境地。

你不能在 B 中包含 templated A 而不使 B 模板化,例如:

template <int size>
class A {
public:
    int a[size];

    int getA(int n) {
       return a[n];
    }
};

template <int size>
class B {
public:
    A<size>* b;

    int getA(int n) {
        return b->getA(n);
    }

    void setB(A<size>* n) {
        b = n;
    }
};

int main()
{
    const int size1 = 10;

    A<size1> data1;
    B<size1> b1;
    
    b1.setB(&data1);
    int a = b1.getA(0);
}

或者给A一个non-templated基础class让B持有,例如:

class A_base
{
    virtual ~A_base() {}
    virtual int getA(int n) = 0;
};

template <int size>
class A : public A_base {
public:
    int a[size];

    int getA(int n) {
       return a[n];
    }
};

class B {
public:
    A_base* b;

    int getA(int n) {
       return b->getA(n);
    }

    void setB(A_base* n) {
        b = n;
    }
};

int main()
{
    const int size1 = 10;

    A<size1> data1;
    B b1;
    
    b1.setB(&data1);
    int a = b1.getA(0);
}

否则,您将不得不让 B 只持有一个 void* 指针,然后要求调用者提取 void* 并决定将其转换为什么,例如:

template <int size>
class A {
public:
    int a[size];

    int getA(int n) {
       return a[n];
    }
};

class B {
public:
    void* b;

    void* getB() {
        return b;
    }

    void setB(void* n) {
        b = n;
    }
};

int main()
{
    const int size1 = 10;

    A<size1> data1;
    B b1;
    
    b1.setB(&data1);
    int a = static_cast< A<size1>* >(b1.getB())->getA(0);
}