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);
}
我正在尝试将指向模板对象的指针传递给另一个 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);
}