C ++:将类作为参数传递给其他类的方法

时间:2013-09-10 15:32:21

标签: c++ function class arguments

我想将一个类指针传递给一个函数,该函数是另一个类的成员,但它不起作用。如果函数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();
};

有人可以给我洞察力吗?提前谢谢

4 个答案:

答案 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;
}

如果你运行这个测试,你将得到你期望的输出。