我想将一个类指针传递给一个函数,该函数是另一个类的成员,但它不起作用。如果函数fill_packet
不是任何类的成员,则代码编译没有问题:
// WORKS FINE:
class Packet{
private:
char *contents;
public:
void pack();
};
void fill_packet(Packet *a){
a->pack();
};
但是,如果函数fill_packet
在另一个类(这里是 Worker )中,那么当我尝试访问a
的方法时,它突然不再编译
// WON'T COMPILE:
// error: ‘Packet’ has not been declared
class Worker{
public:
void fill_packet(Packet *a){
a->pack();
};
};
class Packet{
private:
char *contents;
public:
void pack();
};
有人可以给我洞察力吗?提前谢谢
答案 0 :(得分:3)
可能是在宣布“包裹”之前将工人包括在其他地方的情况。要解决此问题,您可以告诉编译器,当您声明' Worker'以及' fill_packet'的实现时,Packed类是否存在。需要放在宣布两个类的地方;
类似的东西:
class Packet;
class Worker{
public:
void fill_packet(Packet *a);
};
//in a cpp file:
void Worker::fill_packet(Packet *a){
a->pack();
};
希望这有帮助, Raxvan。
答案 1 :(得分:1)
是的,它确实编译了!
也许你已经在一个你没有包含的标题中定义了这个类?
答案 2 :(得分:1)
如果您的代码是这样的
Packet mPacket;
Worker mWorker;
mWorker.fill_packet(&mPacket);
这应该有效。
另一方面
Worker.fill_packet(&mPacket);
除非您声明,否则将无效
class Worker{
public:
static void fill_packet(Packet *a){
a->pack();
};
};
编辑:注意,编译器错误在您发布的代码段中没有意义。
答案 3 :(得分:1)
确保在Class类之前定义了Packet类,这是一个完整的测试:
#include <iostream>
class Packet {
private:
char *contents;
public:
void pack() {
this->contents = "Some text";
}
char * getContents() {
return this->contents;
}
};
class Worker {
public:
void fill_packet(Packet *a) {
a->pack();
}
};
int main() {
Packet * packet = new Packet;
Worker worker;
worker.fill_packet(packet);
std::cout << packet->getContents() << std::endl;
delete packet;
return 0;
}
如果你运行这个测试,你将得到你期望的输出。