0

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

4 回答 4

3

在声明“数据包”之前,可能会在其他地方包含 Worker。要解决此问题,您可以在声明“Worker”时告诉编译器 Packed 类存在,并且需要将“fill_packet”的实现放在声明两个类的地方;

像这样的东西:

class Packet;
class Worker{
public:
  void fill_packet(Packet *a);
};

//in a cpp file:
void Worker::fill_packet(Packet *a){
    a->pack();
};

希望这会有所帮助,拉克斯万。

于 2013-09-10T15:40:45.373 回答
1

是的,它确实编译!

也许您在未包含的标题中定义了该类?

于 2013-09-10T15:39:08.440 回答
1

如果你的代码是这样的

Packet mPacket;
Worker mWorker;
mWorker.fill_packet(&mPacket);

这应该有效。

另一方面

Worker.fill_packet(&mPacket);

将不起作用,除非您声明

class Worker{
public:
  static void fill_packet(Packet *a){
    a->pack();
  };
};

编辑:注意,编译器错误从您发布的代码片段中没有意义。

于 2013-09-10T15:40:02.993 回答
1

确保在 Worker 类之前定义了 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;
}

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

于 2013-09-10T15:49:16.797 回答